screenhand 0.4.3 → 0.4.5

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.
@@ -0,0 +1,750 @@
1
+ {
2
+ "id": "simulator",
3
+ "name": "iPhone Simulator — macOS Desktop Control",
4
+ "platform": "simulator",
5
+ "bundleId": "com.apple.iphonesimulator",
6
+ "description": "iOS Simulator control via macOS Accessibility. Every iOS UI element is exposed through AX, enabling full app automation and validation.",
7
+ "setup": {
8
+ "prerequisites": [
9
+ "Xcode must be installed (provides Simulator + simctl)",
10
+ "Hide competing apps before automation: applescript 'set visible of process \"Code\" to false'",
11
+ "Get booted device UDID: xcrun simctl list devices booted",
12
+ "Connect hardware keyboard for type_text: key('shift+cmd+k')"
13
+ ],
14
+ "decision_guide": {
15
+ "tap_ios_element": "click_text(windowId, 'label', offset_y=-25) — OCR-based, works for all visible text",
16
+ "tap_ios_button_by_ax": "ui_press(pid, 'title') — faster but iOS elements often have no AX title",
17
+ "type_text_into_field": "ui_set_value(pid, '{field_title}', 'text') — sets value via AX directly. BEST METHOD. type_text and clipboard paste are both BROKEN in simulator",
18
+ "navigate_url": "bash: xcrun simctl openurl booted 'URL' — never type URLs manually",
19
+ "launch_app": "bash: xcrun simctl launch booted {bundleId} — fastest and most reliable",
20
+ "install_app": "bash: xcrun simctl install booted '/path/to.app'",
21
+ "device_controls": "key() for Home/Lock/DarkMode/AppSwitcher. menu_click() for Rotate/FaceID/Location",
22
+ "push_notification": "bash: xcrun simctl push booted {bundleId} /path/to/payload.json",
23
+ "permissions": "bash: xcrun simctl privacy booted grant|revoke {service} {bundleId}",
24
+ "screenshot_for_app_store": "bash: xcrun simctl status_bar booted override --time '9:41' --batteryLevel 100, then key('cmd+s')",
25
+ "verify_ui_state": "screenshot() for visual, ui_tree(pid) for AX elements, click_text to verify text exists",
26
+ "unlock_device": "bash: xcrun simctl spawn {udid} notifyutil -p com.apple.springboard.unlockdevice + key('shift+cmd+h')",
27
+ "scroll_ios_list": "scroll(direction, amount) on simulator window, or drag() for precise control",
28
+ "multi_device": "bash: xcrun simctl boot {udid} — can run multiple simultaneously"
29
+ }
30
+ },
31
+ "shortcuts": {
32
+ "Apple": {
33
+ "AXMenu > Force Quit…": "Option+Cmd+⎋",
34
+ "AXMenu > Force Quit Simulator": "Option+Shift+Cmd+⎋",
35
+ "AXMenu > Lock Screen": "Ctrl+Cmd+Q",
36
+ "AXMenu > Log Out…": "Shift+Cmd+Q"
37
+ },
38
+ "Simulator": {
39
+ "AXMenu > Settings…": "Cmd+,",
40
+ "AXMenu > Hide Simulator": "Cmd+H",
41
+ "AXMenu > Hide Others": "Option+Cmd+H",
42
+ "AXMenu > Quit Simulator": "Cmd+Q"
43
+ },
44
+ "File": {
45
+ "AXMenu > Save Screen": "Cmd+S",
46
+ "AXMenu > Save Screen…": "Option+Cmd+S",
47
+ "AXMenu > Record Screen": "Cmd+R",
48
+ "AXMenu > Record Screen…": "Option+Cmd+R",
49
+ "AXMenu > Close Window": "Cmd+W",
50
+ "AXMenu > Close All": "Option+Cmd+W"
51
+ },
52
+ "Edit": {
53
+ "AXMenu > Undo": "Cmd+Z",
54
+ "AXMenu > Redo": "Shift+Cmd+Z",
55
+ "AXMenu > Copy Screen": "Ctrl+Cmd+C"
56
+ },
57
+ "Device": {
58
+ "AXMenu > Rotate Left": "Cmd+←",
59
+ "AXMenu > Rotate Right": "Cmd+→",
60
+ "AXMenu > Home": "Shift+Cmd+H",
61
+ "AXMenu > Lock": "Cmd+L",
62
+ "AXMenu > Siri": "Option+Shift+Cmd+H",
63
+ "AXMenu > Shake": "Ctrl+Cmd+Z",
64
+ "AXMenu > App Switcher": "Ctrl+Shift+Cmd+H",
65
+ "AXMenu > Trigger Screenshot": null
66
+ },
67
+ "I/O": {
68
+ "AXMenu > Send Keyboard Input to Device": "Option+Cmd+K",
69
+ "AXMenu > Connect Hardware Keyboard": "Shift+Cmd+K",
70
+ "AXMenu > Toggle Software Keyboard": "Cmd+K",
71
+ "AXMenu > Increase Volume": "Cmd+↑",
72
+ "AXMenu > Decrease Volume": "Cmd+↓"
73
+ },
74
+ "Features": {
75
+ "AXMenu > Face ID > Matching Face": "Option+Cmd+M",
76
+ "AXMenu > Face ID > Non-matching Face": "Option+Cmd+N",
77
+ "AXMenu > Authorize Apple Pay": "Option+Cmd+A",
78
+ "AXMenu > Toggle Appearance": "Shift+Cmd+A",
79
+ "AXMenu > Toggle In-call Status Bar": "Cmd+Y",
80
+ "AXMenu > Increase Preferred Text Size": "Option+Cmd++",
81
+ "AXMenu > Decrease Preferred Text Size": "Option+Cmd+-",
82
+ "AXMenu > Trigger iCloud Sync": "Shift+Cmd+I"
83
+ },
84
+ "Debug": {
85
+ "AXMenu > Open System Log…": "Cmd+/",
86
+ "AXMenu > Simulate Memory Warning": "Shift+Cmd+M",
87
+ "AXMenu > Slow Animations": null,
88
+ "AXMenu > Show Parallel Testing Devices": null
89
+ },
90
+ "Window": {
91
+ "AXMenu > Minimize": "Cmd+M",
92
+ "AXMenu > Fill": "Ctrl+Cmd+F",
93
+ "AXMenu > Center": "Ctrl+Cmd+C",
94
+ "AXMenu > Enter Full Screen": "Cmd+F",
95
+ "AXMenu > Physical Size": "Cmd+1",
96
+ "AXMenu > Point Accurate": "Cmd+2",
97
+ "AXMenu > Pixel Accurate": "Cmd+3",
98
+ "AXMenu > Fit Screen": "Cmd+4",
99
+ "AXMenu > Show Apple TV Remote": "Shift+Cmd+R",
100
+ "AXMenu > Show Device Bezels": null,
101
+ "AXMenu > Stay On Top": null
102
+ }
103
+ },
104
+ "selectors": {
105
+ "simulator_window": {
106
+ "hardware_buttons": {
107
+ "action_button": "AXButton[title='Action']",
108
+ "volume_up": "AXButton[title='Volume Up']",
109
+ "volume_down": "AXButton[title='Volume Down']",
110
+ "sleep_wake": "AXButton[title='Sleep/Wake']"
111
+ },
112
+ "toolbar": {
113
+ "note": "AXToolbar with 3 buttons at bottom of simulator chrome"
114
+ },
115
+ "device_info": {
116
+ "device_name": "AXStaticText (e.g. 'iPhone 16 Plus')",
117
+ "os_version": "AXStaticText (e.g. 'iOS 18.6')"
118
+ }
119
+ },
120
+ "ios_home_screen": {
121
+ "widgets": "AXButton[title*='Widget']",
122
+ "date_button": "AXButton[title*='March']",
123
+ "page_indicator": "AXSlider[title*='Page']",
124
+ "search_button": "AXButton[title='Search']",
125
+ "app_icons": "AXButton (unnamed grid items on home screen)"
126
+ }
127
+ },
128
+ "flows": {
129
+ "open_device": {
130
+ "description": "Open a specific simulator device",
131
+ "steps": [
132
+ "menu_click('File/Open Simulator/{device_name}')"
133
+ ]
134
+ },
135
+ "go_home": {
136
+ "description": "Return to iOS home screen",
137
+ "verified": true,
138
+ "steps": [
139
+ "key('shift+cmd+h')"
140
+ ]
141
+ },
142
+ "lock_device": {
143
+ "description": "Lock the simulated device",
144
+ "verified": true,
145
+ "steps": [
146
+ "key('cmd+l')"
147
+ ]
148
+ },
149
+ "unlock_device": {
150
+ "description": "Unlock a locked simulator device",
151
+ "verified": true,
152
+ "steps": [
153
+ "bash: xcrun simctl spawn {udid} notifyutil -p com.apple.springboard.unlockdevice",
154
+ "key('shift+cmd+h') -- go to home screen"
155
+ ]
156
+ },
157
+ "rotate_landscape": {
158
+ "description": "Rotate device to landscape",
159
+ "verified": true,
160
+ "steps": [
161
+ "menu_click('Device/Rotate Right') -- key shortcut unreliable, use menu"
162
+ ]
163
+ },
164
+ "rotate_portrait": {
165
+ "description": "Rotate device back to portrait",
166
+ "verified": true,
167
+ "steps": [
168
+ "menu_click('Device/Rotate Left') -- key shortcut unreliable, use menu"
169
+ ]
170
+ },
171
+ "app_switcher": {
172
+ "description": "Open iOS app switcher",
173
+ "steps": [
174
+ "key('ctrl+shift+cmd+h')"
175
+ ]
176
+ },
177
+ "shake_device": {
178
+ "description": "Simulate device shake gesture",
179
+ "steps": [
180
+ "key('ctrl+cmd+z')"
181
+ ]
182
+ },
183
+ "toggle_dark_mode": {
184
+ "description": "Switch between light and dark appearance",
185
+ "verified": true,
186
+ "steps": [
187
+ "key('shift+cmd+a')"
188
+ ]
189
+ },
190
+ "simulate_face_id_success": {
191
+ "description": "Trigger a matching Face ID scan",
192
+ "verified": true,
193
+ "steps": [
194
+ "menu_click('Features/Face ID/Enrolled') -- enable first if needed",
195
+ "key('option+cmd+m')"
196
+ ]
197
+ },
198
+ "simulate_face_id_failure": {
199
+ "description": "Trigger a non-matching Face ID scan",
200
+ "steps": [
201
+ "key('option+cmd+n')"
202
+ ]
203
+ },
204
+ "authorize_apple_pay": {
205
+ "description": "Authorize Apple Pay transaction in simulator",
206
+ "steps": [
207
+ "key('option+cmd+a')"
208
+ ]
209
+ },
210
+ "save_screenshot": {
211
+ "description": "Save simulator screen to file",
212
+ "steps": [
213
+ "key('cmd+s')"
214
+ ]
215
+ },
216
+ "record_screen": {
217
+ "description": "Start/stop screen recording",
218
+ "steps": [
219
+ "key('cmd+r') -- toggle recording"
220
+ ]
221
+ },
222
+ "copy_screen": {
223
+ "description": "Copy simulator screen to clipboard",
224
+ "steps": [
225
+ "key('ctrl+cmd+c')"
226
+ ]
227
+ },
228
+ "open_system_log": {
229
+ "description": "Open Console with simulator system log",
230
+ "steps": [
231
+ "key('cmd+/')"
232
+ ]
233
+ },
234
+ "simulate_memory_warning": {
235
+ "description": "Send memory warning to running app",
236
+ "steps": [
237
+ "key('shift+cmd+m')"
238
+ ]
239
+ },
240
+ "set_custom_location": {
241
+ "description": "Set GPS coordinates for location simulation",
242
+ "steps": [
243
+ "menu_click('Features/Location/Custom Location…')",
244
+ "type coordinates in dialog"
245
+ ]
246
+ },
247
+ "set_location_city_run": {
248
+ "description": "Simulate moving GPS (city run route)",
249
+ "verified": true,
250
+ "steps": [
251
+ "menu_click('Features/Location/City Run')"
252
+ ]
253
+ },
254
+ "set_location_freeway": {
255
+ "description": "Simulate moving GPS (freeway drive)",
256
+ "steps": [
257
+ "menu_click('Features/Location/Freeway Drive')"
258
+ ]
259
+ },
260
+ "toggle_software_keyboard": {
261
+ "description": "Show/hide iOS software keyboard",
262
+ "steps": [
263
+ "key('cmd+k')"
264
+ ]
265
+ },
266
+ "send_keyboard_to_device": {
267
+ "description": "Route Mac keyboard input to iOS device",
268
+ "steps": [
269
+ "key('option+cmd+k')"
270
+ ]
271
+ },
272
+ "erase_device": {
273
+ "description": "Factory reset the simulator",
274
+ "steps": [
275
+ "menu_click('Device/Erase All Content and Settings…')",
276
+ "confirm dialog"
277
+ ]
278
+ },
279
+ "trigger_ios_screenshot": {
280
+ "description": "Trigger iOS screenshot (appears in Photos app)",
281
+ "steps": [
282
+ "menu_click('Device/Trigger Screenshot')"
283
+ ]
284
+ },
285
+ "enable_slow_animations": {
286
+ "description": "Slow down all iOS animations for debugging",
287
+ "steps": [
288
+ "menu_click('Debug/Slow Animations')"
289
+ ]
290
+ },
291
+ "enable_carplay": {
292
+ "description": "Open CarPlay external display",
293
+ "steps": [
294
+ "menu_click('I/O/External Displays/CarPlay')"
295
+ ]
296
+ },
297
+ "increase_text_size": {
298
+ "description": "Increase iOS Dynamic Type text size",
299
+ "steps": [
300
+ "key('option+cmd+=')"
301
+ ]
302
+ },
303
+ "decrease_text_size": {
304
+ "description": "Decrease iOS Dynamic Type text size",
305
+ "steps": [
306
+ "key('option+cmd+-')"
307
+ ]
308
+ },
309
+ "trigger_icloud_sync": {
310
+ "description": "Force iCloud sync on simulator",
311
+ "steps": [
312
+ "key('shift+cmd+i')"
313
+ ]
314
+ },
315
+ "open_ios_app": {
316
+ "description": "Open an app on the iOS home screen",
317
+ "verified": true,
318
+ "steps": [
319
+ "key('shift+cmd+h') -- go home first",
320
+ "click_text(windowId, '{AppName}', offset_y=-25) -- click icon above label",
321
+ "ALTERNATIVE: bash: xcrun simctl launch booted {bundleId}"
322
+ ]
323
+ },
324
+ "type_in_ios_field": {
325
+ "description": "Type text into an iOS text field",
326
+ "verified": true,
327
+ "warning": "type_text and clipboard paste both produce garbled text. Use ui_set_value instead.",
328
+ "steps": [
329
+ "ui_set_value(pid, '{field_title_or_value}', 'your text here') -- BEST METHOD, sets via AX directly",
330
+ "ALTERNATIVE: menu_click('Edit/Send Pasteboard') to sync clipboard, then tap field + paste",
331
+ "BROKEN: type_text produces wrong chars, clipboard cmd+v also unreliable"
332
+ ]
333
+ },
334
+ "navigate_safari_url": {
335
+ "description": "Navigate to URL in simulator Safari",
336
+ "verified": true,
337
+ "steps": [
338
+ "bash: xcrun simctl openurl booted 'https://example.com'"
339
+ ]
340
+ },
341
+ "scroll_ios_list": {
342
+ "description": "Scroll a list in iOS app",
343
+ "steps": [
344
+ "scroll(direction='down', amount=3) -- on the simulator window"
345
+ ]
346
+ },
347
+ "navigate_ios_back": {
348
+ "description": "Tap iOS back button",
349
+ "steps": [
350
+ "ui_press('Back') or click_text('Back')"
351
+ ]
352
+ },
353
+ "navigate_ios_tab": {
354
+ "description": "Switch tab in iOS tab bar",
355
+ "steps": [
356
+ "ui_press('{TabName}') -- tab bar items are AX-exposed"
357
+ ]
358
+ },
359
+ "ios_swipe_to_delete": {
360
+ "description": "Swipe-to-delete on a list row",
361
+ "steps": [
362
+ "drag(startX, startY, endX, endY) -- swipe left on the row",
363
+ "ui_press('Delete') or click_text('Delete')"
364
+ ]
365
+ },
366
+ "ios_pull_to_refresh": {
367
+ "description": "Pull-to-refresh in a scrollable view",
368
+ "steps": [
369
+ "drag(centerX, topY, centerX, bottomY) -- drag down from top of list"
370
+ ]
371
+ }
372
+ },
373
+ "simctl": {
374
+ "description": "xcrun simctl CLI commands for programmatic simulator control",
375
+ "commands": {
376
+ "list_devices": "xcrun simctl list devices",
377
+ "boot_device": "xcrun simctl boot '{device_udid}'",
378
+ "shutdown_device": "xcrun simctl shutdown '{device_udid}'",
379
+ "install_app": "xcrun simctl install booted '{path_to.app}'",
380
+ "uninstall_app": "xcrun simctl uninstall booted '{bundle_id}'",
381
+ "launch_app": "xcrun simctl launch booted '{bundle_id}'",
382
+ "terminate_app": "xcrun simctl terminate booted '{bundle_id}'",
383
+ "open_url": "xcrun simctl openurl booted '{url}'",
384
+ "send_push": "xcrun simctl push booted '{bundle_id}' '{payload.json}'",
385
+ "set_location": "xcrun simctl location booted set {lat},{lon}",
386
+ "add_photo": "xcrun simctl addmedia booted '{photo_path}'",
387
+ "add_video": "xcrun simctl addmedia booted '{video_path}'",
388
+ "get_app_container": "xcrun simctl get_app_container booted '{bundle_id}'",
389
+ "status_bar_override": "xcrun simctl status_bar booted override --time '9:41' --batteryLevel 100 --cellularBars 4",
390
+ "status_bar_clear": "xcrun simctl status_bar booted clear",
391
+ "privacy_grant": "xcrun simctl privacy booted grant {service} {bundle_id}",
392
+ "privacy_revoke": "xcrun simctl privacy booted revoke {service} {bundle_id}",
393
+ "keychain_reset": "xcrun simctl keychain booted reset",
394
+ "io_screenshot": "xcrun simctl io booted screenshot '{output_path}'",
395
+ "io_recordvideo": "xcrun simctl io booted recordVideo '{output_path}'",
396
+ "spawn_command": "xcrun simctl spawn booted {command}",
397
+ "erase_device": "xcrun simctl erase '{device_udid}'"
398
+ }
399
+ },
400
+ "available_devices": {
401
+ "iphones": [
402
+ "iPhone 16 Pro",
403
+ "iPhone 16 Pro Max",
404
+ "iPhone 16e",
405
+ "iPhone 16",
406
+ "iPhone 16 Plus"
407
+ ],
408
+ "ipads": [
409
+ "iPad Pro 11-inch (M4)",
410
+ "iPad Pro 13-inch (M4)",
411
+ "iPad mini (A17 Pro)",
412
+ "iPad (A16)",
413
+ "iPad Air 13-inch (M3)",
414
+ "iPad Air 11-inch (M3)"
415
+ ],
416
+ "custom_personas": [
417
+ "Teacher - iPhone 15 Pro",
418
+ "Admin - iPhone 15 Pro Max",
419
+ "Parent - iPhone 14",
420
+ "Student - iPhone 14 Plus"
421
+ ],
422
+ "ios_version": "iOS 18.6 (22G86)"
423
+ },
424
+ "errors": [
425
+ {
426
+ "pattern": "platform_explore reports 'App not running'",
427
+ "solution": "Known bug — platform_explore doesn't detect Simulator. Use ui_tree(pid) + scan_menu_bar instead."
428
+ },
429
+ {
430
+ "pattern": "type_text produces wrong characters (e.g. 'aaaaaaaaa' instead of 'apple.com')",
431
+ "solution": "type_text sends macOS key events which don't map correctly to iOS text fields. Workarounds: (1) Use simctl openurl for URLs, (2) Use simctl launch with args, (3) Use Edit > Paste with clipboard (applescript to set clipboard + cmd+v), (4) Ensure Connect Hardware Keyboard is ON (Shift+Cmd+K)"
432
+ },
433
+ {
434
+ "pattern": "Lock screen won't unlock with Home shortcut or drag",
435
+ "solution": "Use simctl to unlock: xcrun simctl spawn {udid} notifyutil -p com.apple.springboard.unlockdevice, then press Home (Shift+Cmd+H)"
436
+ },
437
+ {
438
+ "pattern": "iOS app icons show as unnamed AXButton in ui_tree",
439
+ "solution": "Home screen app icons don't expose titles via AX. Use click_text(windowId, 'AppName') with offset_y=-25 to click the icon above the label, or use simctl launch booted {bundleId}"
440
+ },
441
+ {
442
+ "pattern": "click_text hits wrong element due to Finder/background window text",
443
+ "solution": "Always hide competing apps first: applescript 'set visible of process X to false'. Use windowId param to scope OCR to simulator window only."
444
+ },
445
+ {
446
+ "pattern": "scroll() doesn't scroll iOS content inside simulator",
447
+ "solution": "macOS scroll events don't propagate into iOS simulator content. Use drag(fromX, fromY, toX, toY) within the device screen area to simulate iOS swipe/scroll gestures."
448
+ },
449
+ {
450
+ "pattern": "drag/swipe gestures don't work on iOS home screen or lock screen",
451
+ "solution": "iOS home screen swipe requires precise coordinates within the device bezel. Use simctl commands as alternatives (simctl openurl, simctl launch) instead of UI gestures."
452
+ }
453
+ ],
454
+ "installed_apps": {
455
+ "Safari": "com.apple.mobilesafari",
456
+ "Settings": "com.apple.Preferences",
457
+ "Maps": "com.apple.Maps",
458
+ "Calendar": "com.apple.mobilecal",
459
+ "Photos": "com.apple.mobileslideshow",
460
+ "Health": "com.apple.Health",
461
+ "Reminders": "com.apple.reminders",
462
+ "News": "com.apple.news",
463
+ "Wallet": "com.apple.Passbook",
464
+ "Contacts": "com.apple.MobileAddressBook",
465
+ "Messages": "com.apple.MobileSMS",
466
+ "Files": "com.apple.DocumentsApp",
467
+ "Fitness": "com.apple.Fitness",
468
+ "Shortcuts": "com.apple.shortcuts",
469
+ "Passwords": "com.apple.Passwords",
470
+ "Watch": "com.apple.Bridge",
471
+ "Web": "com.apple.webapp",
472
+ "Xcode Previews": "com.apple.PreviewShell"
473
+ },
474
+ "ios_settings_categories": [
475
+ "Apple Account (sign in)",
476
+ "General (About, AutoFill & Passwords, Dictionary, Fonts, Keyboard, Language & Region, VPN & Device Management, Transfer or Reset iPhone)",
477
+ "Accessibility",
478
+ "Action Button",
479
+ "Apple Intelligence & Siri",
480
+ "Camera",
481
+ "Home Screen & App Library",
482
+ "Search",
483
+ "StandBy",
484
+ "Screen Time",
485
+ "Privacy & Security",
486
+ "Game Center"
487
+ ],
488
+ "ios_user_features": {
489
+ "safari": {
490
+ "description": "Browse web, bookmarks, tabs, reading list, private browsing",
491
+ "launch": "xcrun simctl launch booted com.apple.mobilesafari",
492
+ "open_url": "xcrun simctl openurl booted 'https://example.com'",
493
+ "testable": ["navigation", "tabs", "bookmarks", "search", "form fill", "JavaScript", "cookies", "downloads", "reader mode", "private browsing", "auto-fill"]
494
+ },
495
+ "maps": {
496
+ "description": "View maps, search locations, get directions, drop pins",
497
+ "launch": "xcrun simctl launch booted com.apple.Maps",
498
+ "testable": ["search location", "get directions", "drop pin", "satellite view", "zoom/pan", "share location", "favorites"]
499
+ },
500
+ "calendar": {
501
+ "description": "Create events, set reminders, view day/week/month/year",
502
+ "launch": "xcrun simctl launch booted com.apple.mobilecal",
503
+ "testable": ["create event", "edit event", "delete event", "view modes", "alerts", "repeat events", "all-day events"]
504
+ },
505
+ "photos": {
506
+ "description": "View photos, albums, memories, edit, share",
507
+ "launch": "xcrun simctl launch booted com.apple.mobileslideshow",
508
+ "add_media": "xcrun simctl addmedia booted '/path/to/photo.jpg'",
509
+ "testable": ["view photo", "create album", "edit photo", "share", "delete", "favorites", "search", "people & places"]
510
+ },
511
+ "contacts": {
512
+ "description": "Add/edit/delete contacts, groups, favorites",
513
+ "launch": "xcrun simctl launch booted com.apple.MobileAddressBook",
514
+ "testable": ["add contact", "edit contact", "delete contact", "search", "groups", "share contact", "favorites"]
515
+ },
516
+ "messages": {
517
+ "description": "Send/receive iMessage and SMS (limited in simulator)",
518
+ "launch": "xcrun simctl launch booted com.apple.MobileSMS",
519
+ "testable": ["compose message", "UI navigation", "group creation", "message search"]
520
+ },
521
+ "reminders": {
522
+ "description": "Create tasks, lists, due dates, priorities, tags",
523
+ "launch": "xcrun simctl launch booted com.apple.reminders",
524
+ "testable": ["create reminder", "create list", "set due date", "set priority", "mark complete", "search", "tags"]
525
+ },
526
+ "files": {
527
+ "description": "Browse local and iCloud files, folders, tags",
528
+ "launch": "xcrun simctl launch booted com.apple.DocumentsApp",
529
+ "testable": ["browse folders", "create folder", "rename", "delete", "move", "share", "tags", "search"]
530
+ },
531
+ "health": {
532
+ "description": "View health data, medical ID, trends",
533
+ "launch": "xcrun simctl launch booted com.apple.Health",
534
+ "testable": ["summary view", "browse categories", "medical ID", "sharing"]
535
+ },
536
+ "news": {
537
+ "description": "Browse news, topics, saved stories",
538
+ "launch": "xcrun simctl launch booted com.apple.news",
539
+ "testable": ["browse feed", "search", "save story", "share", "follow topic"]
540
+ },
541
+ "wallet": {
542
+ "description": "Apple Pay cards, passes, keys, IDs",
543
+ "launch": "xcrun simctl launch booted com.apple.Passbook",
544
+ "testable": ["view cards", "Apple Pay (with simctl authorize)", "passes"]
545
+ },
546
+ "shortcuts": {
547
+ "description": "Create and run automation shortcuts",
548
+ "launch": "xcrun simctl launch booted com.apple.shortcuts",
549
+ "testable": ["browse gallery", "create shortcut", "run shortcut", "add actions", "automation triggers"]
550
+ },
551
+ "fitness": {
552
+ "description": "Activity rings, workout history, trends",
553
+ "launch": "xcrun simctl launch booted com.apple.Fitness",
554
+ "testable": ["view summary", "browse workouts", "sharing"]
555
+ },
556
+ "passwords": {
557
+ "description": "View and manage saved passwords, passkeys",
558
+ "launch": "xcrun simctl launch booted com.apple.Passwords",
559
+ "testable": ["view passwords", "add password", "search", "security recommendations"]
560
+ },
561
+ "settings_general": {
562
+ "description": "About, Keyboard, Language, VPN, Reset",
563
+ "testable": ["view about", "change keyboard", "change language", "reset settings"]
564
+ },
565
+ "settings_accessibility": {
566
+ "description": "VoiceOver, Display & Text Size, Motion, Touch accommodations",
567
+ "testable": ["enable VoiceOver", "increase text size", "reduce motion", "bold text", "increase contrast", "color filters"]
568
+ },
569
+ "settings_privacy": {
570
+ "description": "Location Services, Contacts, Calendars, Photos, Camera, Microphone permissions",
571
+ "privacy_grant": "xcrun simctl privacy booted grant {service} {bundleId}",
572
+ "testable": ["view permissions", "toggle location", "toggle camera", "toggle photos", "app tracking transparency"]
573
+ },
574
+ "settings_screen_time": {
575
+ "description": "App limits, downtime, content restrictions",
576
+ "testable": ["set app limits", "set downtime", "content restrictions"]
577
+ },
578
+ "settings_camera": {
579
+ "description": "Photo/video format, grid, HDR, preserve settings",
580
+ "testable": ["change format", "toggle grid", "toggle HDR"]
581
+ },
582
+ "settings_action_button": {
583
+ "description": "Customize iPhone 16 Action Button assignment",
584
+ "testable": ["change action", "set to camera/flashlight/shortcuts/accessibility"]
585
+ },
586
+ "settings_home_screen": {
587
+ "description": "App Library, notification badges, new app downloads location",
588
+ "testable": ["toggle search", "show in App Library", "badge settings"]
589
+ },
590
+ "settings_standby": {
591
+ "description": "StandBy clock/photos/widgets display when charging landscape",
592
+ "testable": ["enable StandBy", "choose clock style", "select widgets"]
593
+ }
594
+ },
595
+ "ios_gestures": {
596
+ "tap": "click(x, y) or click_text(windowId, 'text')",
597
+ "long_press": "click(x, y) with holdMs or drag(from, to) with same coordinates",
598
+ "swipe_up": "drag(fromX, fromY, toX, toY-200) — home gesture, dismiss, scroll up",
599
+ "swipe_down": "drag(fromX, fromY, toX, toY+200) — notification center, pull to refresh",
600
+ "swipe_left": "drag(fromX, fromY, fromX-200, fromY) — next page, delete row",
601
+ "swipe_right": "drag(fromX, fromY, fromX+200, fromY) — back navigation, previous page",
602
+ "pinch_zoom": "Not supported via macOS AX — use simctl or accessibility zoom instead",
603
+ "scroll": "scroll(x, y, deltaY) or drag() — scroll works on simulator window"
604
+ },
605
+ "features": [
606
+ {
607
+ "id": "home_button", "name": "Home Button", "level": "beginner",
608
+ "description": "Return to iOS home screen (Shift+Cmd+H)"
609
+ },
610
+ {
611
+ "id": "rotate_device", "name": "Rotate Device", "level": "beginner",
612
+ "description": "Rotate between portrait and landscape orientations"
613
+ },
614
+ {
615
+ "id": "lock_unlock", "name": "Lock/Unlock", "level": "beginner",
616
+ "description": "Lock device (Cmd+L), unlock by clicking"
617
+ },
618
+ {
619
+ "id": "screenshot", "name": "Screenshot", "level": "beginner",
620
+ "description": "Save screen (Cmd+S) or copy (Ctrl+Cmd+C)"
621
+ },
622
+ {
623
+ "id": "screen_recording", "name": "Screen Recording", "level": "beginner",
624
+ "description": "Record simulator screen to video (Cmd+R)"
625
+ },
626
+ {
627
+ "id": "keyboard_input", "name": "Keyboard Input", "level": "beginner",
628
+ "description": "Type into iOS fields via hardware keyboard (Shift+Cmd+K) or software keyboard (Cmd+K)"
629
+ },
630
+ {
631
+ "id": "app_launch", "name": "Launch iOS App", "level": "beginner",
632
+ "description": "Tap app icons on home screen to launch"
633
+ },
634
+ {
635
+ "id": "app_switcher", "name": "App Switcher", "level": "beginner",
636
+ "description": "View and switch between running apps (Ctrl+Shift+Cmd+H)"
637
+ },
638
+ {
639
+ "id": "face_id", "name": "Face ID Simulation", "level": "pro",
640
+ "description": "Simulate matching/non-matching Face ID for biometric testing"
641
+ },
642
+ {
643
+ "id": "apple_pay", "name": "Apple Pay", "level": "pro",
644
+ "description": "Authorize Apple Pay transactions (Option+Cmd+A)"
645
+ },
646
+ {
647
+ "id": "location_simulation", "name": "Location Simulation", "level": "pro",
648
+ "description": "Custom GPS coordinates, city run, bicycle ride, freeway drive"
649
+ },
650
+ {
651
+ "id": "dark_mode", "name": "Appearance Toggle", "level": "pro",
652
+ "description": "Switch light/dark mode (Shift+Cmd+A)"
653
+ },
654
+ {
655
+ "id": "dynamic_type", "name": "Dynamic Type", "level": "pro",
656
+ "description": "Increase/decrease preferred text size for accessibility testing"
657
+ },
658
+ {
659
+ "id": "memory_warning", "name": "Memory Warning", "level": "pro",
660
+ "description": "Simulate low memory to test app behavior (Shift+Cmd+M)"
661
+ },
662
+ {
663
+ "id": "shake_gesture", "name": "Shake Gesture", "level": "pro",
664
+ "description": "Trigger shake (Ctrl+Cmd+Z) for undo or feedback features"
665
+ },
666
+ {
667
+ "id": "push_notifications", "name": "Push Notifications", "level": "expert",
668
+ "description": "Send push via simctl with custom JSON payload"
669
+ },
670
+ {
671
+ "id": "deep_links", "name": "Deep Links / URL Schemes", "level": "expert",
672
+ "description": "Open URLs in simulator via simctl openurl"
673
+ },
674
+ {
675
+ "id": "privacy_permissions", "name": "Privacy Permissions", "level": "expert",
676
+ "description": "Grant/revoke camera, location, photos, contacts permissions via simctl"
677
+ },
678
+ {
679
+ "id": "status_bar_override", "name": "Status Bar Override", "level": "expert",
680
+ "description": "Set time, battery, signal bars for consistent screenshots"
681
+ },
682
+ {
683
+ "id": "slow_animations", "name": "Slow Animations", "level": "expert",
684
+ "description": "Debug animation issues by slowing all transitions"
685
+ },
686
+ {
687
+ "id": "carplay", "name": "CarPlay", "level": "expert",
688
+ "description": "External display for CarPlay testing"
689
+ },
690
+ {
691
+ "id": "system_log", "name": "System Log", "level": "expert",
692
+ "description": "Open Console with live simulator logs (Cmd+/)"
693
+ },
694
+ {
695
+ "id": "color_debug", "name": "Color Debug Overlays", "level": "expert",
696
+ "description": "Blended layers, copied images, misaligned images, off-screen rendered"
697
+ },
698
+ {
699
+ "id": "icloud_sync", "name": "iCloud Sync", "level": "expert",
700
+ "description": "Force trigger iCloud sync (Shift+Cmd+I)"
701
+ },
702
+ {
703
+ "id": "multi_device", "name": "Multi-Device Testing", "level": "grandmaster",
704
+ "description": "Run multiple simulators simultaneously for cross-device validation"
705
+ },
706
+ {
707
+ "id": "parallel_testing", "name": "Parallel Testing Devices", "level": "grandmaster",
708
+ "description": "Show/manage parallel testing device fleet"
709
+ },
710
+ {
711
+ "id": "simctl_automation", "name": "simctl CLI Automation", "level": "grandmaster",
712
+ "description": "Full programmatic control: install, launch, push, permissions, media injection"
713
+ },
714
+ {
715
+ "id": "persona_testing", "name": "Persona-Based Testing", "level": "grandmaster",
716
+ "description": "Named simulators (Teacher, Admin, Parent, Student) for role-based testing"
717
+ }
718
+ ],
719
+ "websiteFeatures": [],
720
+ "valueAddFeatures": [
721
+ {
722
+ "id": "bulk_screenshot_devices",
723
+ "name": "Bulk Screenshot All Devices",
724
+ "description": "Take screenshots across all available devices for App Store submissions",
725
+ "category": "bulk",
726
+ "level": "SSS"
727
+ },
728
+ {
729
+ "id": "cross_device_validation",
730
+ "name": "Cross-Device UI Validation",
731
+ "description": "Run same flow on iPhone SE through iPad Pro, compare UI layout",
732
+ "category": "cross-app",
733
+ "level": "SSS"
734
+ },
735
+ {
736
+ "id": "accessibility_audit",
737
+ "name": "iOS Accessibility Audit",
738
+ "description": "Test Dynamic Type, VoiceOver labels, contrast across all sizes",
739
+ "category": "intelligence",
740
+ "level": "SSS"
741
+ },
742
+ {
743
+ "id": "regression_flow",
744
+ "name": "iOS Regression Runner",
745
+ "description": "Record and replay user flows across app updates",
746
+ "category": "monitoring",
747
+ "level": "SSS"
748
+ }
749
+ ]
750
+ }