@unotest/mobile 0.9.1 → 0.10.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.
- package/CHANGELOG.md +31 -15
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,22 @@ All notable changes to `@unotest/mobile` will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
|
|
7
|
+
## [0.10.0] - 2026-08-06
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [7ed750c]
|
|
12
|
+
- Updated dependencies [574841f]
|
|
13
|
+
- Updated dependencies [337a31c]
|
|
14
|
+
- @unotest/dsl@0.10.0
|
|
15
|
+
- @unotest/protocol@0.10.0
|
|
16
|
+
- @unotest/core@0.10.0
|
|
17
|
+
- @unotest/viewer@0.10.0
|
|
18
|
+
|
|
19
|
+
## [0.9.2] - 2026-06-16
|
|
20
|
+
|
|
21
|
+
Released in lockstep with the rest of the ecosystem. No functional changes.
|
|
22
|
+
|
|
7
23
|
## [0.9.1] - 2026-06-14
|
|
8
24
|
|
|
9
25
|
### Changed
|
|
@@ -62,8 +78,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
62
78
|
all running on the same Mac), the iOS keyboard layer couldn't keep
|
|
63
79
|
up and randomly dropped 1-3 characters from the middle of the string
|
|
64
80
|
— observed live as `petr@volkov.io` → `pr@volkov.io`, `Qwerty34##`
|
|
65
|
-
→ `Qwery34##`. P4 / S8 had only addressed the unrelated
|
|
66
|
-
keyboard-
|
|
81
|
+
→ `Qwery34##`. P4 / S8 had only addressed the unrelated _wrong-
|
|
82
|
+
keyboard-layout_ failure (Cyrillic keyboard eating Latin chars
|
|
67
83
|
wholesale); this race is a separate failure mode that survived.
|
|
68
84
|
- **Fix 1 — `ConnectHardwareKeyboard` pinned OFF on install.**
|
|
69
85
|
The `pinEnglishKeyboard` step (S8) now also writes
|
|
@@ -113,7 +129,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
113
129
|
`npx @unotest/mobile@latest install ...`. The stale global frequently
|
|
114
130
|
had the pre-0.1.4 strict env schema, so the MCP server crashed at
|
|
115
131
|
startup with `Invalid environment. ... INVITE_DEEPLINK_PREFIX:
|
|
116
|
-
|
|
132
|
+
Required, API_BASE_URL: Required, ...`. Claude Code then surfaced
|
|
117
133
|
`-32000 Connection closed` and the agent fell back to draft-mode
|
|
118
134
|
scenario authoring — defeating the entire MCP-driven flow the
|
|
119
135
|
install just bootstrapped.
|
|
@@ -173,7 +189,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
173
189
|
`result.detectedPermissions`.
|
|
174
190
|
- **Pre-grant on install.** When the resolved permissions list is
|
|
175
191
|
non-empty, every service is granted with `simctl privacy <udid> grant
|
|
176
|
-
|
|
192
|
+
<service> <bundleId>` immediately after install. Pre-empts SpringBoard
|
|
177
193
|
permission dialogs (location, motion, photos, …) that would otherwise
|
|
178
194
|
block scenarios on first launch — those dialogs live in SpringBoard,
|
|
179
195
|
not in the app's a11y tree.
|
|
@@ -213,7 +229,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
213
229
|
- **New `alert:` section in `mode: "outline"`.** When a native
|
|
214
230
|
`UIAlertController` is on screen its title, body, and button labels
|
|
215
231
|
appear as the first section of the outline, plus a `_meta.alert_active:
|
|
216
|
-
|
|
232
|
+
true` flag. Previously the alert lived in SpringBoard (outside the
|
|
217
233
|
app's a11y tree) and the agent kept tapping the underlying button
|
|
218
234
|
through the modal — usually the wrong one, sometimes destructive.
|
|
219
235
|
- **Grammar contract.** The `alert:` section and `_meta.alert_active`
|
|
@@ -267,7 +283,7 @@ After the fixes, `run_test` on a freshly-generated exploration returned
|
|
|
267
283
|
is unchanged — keychain reset only fires when the caller explicitly
|
|
268
284
|
opts into a fresh state.
|
|
269
285
|
- Keychain reset is invoked **unconditionally** in the `app_install
|
|
270
|
-
|
|
286
|
+
{ clean: true }` flow even when `simctl uninstall` reports "app not
|
|
271
287
|
installed" — prior-run tokens may still linger, that's the whole
|
|
272
288
|
reason for B5.
|
|
273
289
|
- MCP descriptions for `app_install`'s `clean` parameter and
|
|
@@ -283,7 +299,7 @@ After the fixes, `run_test` on a freshly-generated exploration returned
|
|
|
283
299
|
one tool — `explore_step { action: "tap" | "type" | … }`. The single
|
|
284
300
|
rule: passing `explorationId` records the call into an exploration
|
|
285
301
|
session; omitting it runs the action ad-hoc. There is no `record:
|
|
286
|
-
|
|
302
|
+
false` override.
|
|
287
303
|
- **Alerts (`accept_alert`, `dismiss_alert`) appear here for the first
|
|
288
304
|
time as `explore_step` actions** — not as separate tools. The
|
|
289
305
|
Driver+DSL alert layer landed in P0; this release wires the MCP
|
|
@@ -384,12 +400,12 @@ unchanged.
|
|
|
384
400
|
on UIAlertController, last on action sheet).
|
|
385
401
|
- `readAlert()` — return title + body of the active alert as a string,
|
|
386
402
|
or throw `NoAlertPresentError` if none is on screen.
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
403
|
+
Before this, scenarios had no way to dismiss SpringBoard alerts: the
|
|
404
|
+
resolver-driven `tap(getByTestId(...))` couldn't reach buttons that
|
|
405
|
+
live outside the app process — `ordinal` selectors appeared to match
|
|
406
|
+
but the tap landed on the wrong element. Pre-granting permissions via
|
|
407
|
+
`xcrun simctl privacy` was the only workaround. MCP exposure (as
|
|
408
|
+
`explore_step` actions) lands in a follow-up.
|
|
393
409
|
|
|
394
410
|
## [0.3.0] — 2026-05-15
|
|
395
411
|
|
|
@@ -460,7 +476,7 @@ unchanged.
|
|
|
460
476
|
|
|
461
477
|
- **Simulator runtime disambiguation.** When multiple simulators share
|
|
462
478
|
a name across iOS versions, pin to one via `SIM_A_NAME=<name> @
|
|
463
|
-
|
|
479
|
+
<runtime>` (e.g. `SIM_A_NAME=iPhone 16 @ iOS 17.5`). The runtime
|
|
464
480
|
part is matched as a substring of the friendly runtime name, so
|
|
465
481
|
partial values like `iOS 17` work too. The `Sim "X" not found` error
|
|
466
482
|
now lists all available sims with their runtime.
|
|
@@ -493,7 +509,7 @@ unchanged.
|
|
|
493
509
|
persist.
|
|
494
510
|
- **Pre-launch precondition check.** `WdaDriver.getSession()` now
|
|
495
511
|
verifies `APP_BUNDLE_ID` is installed on the target sim via `simctl
|
|
496
|
-
|
|
512
|
+
get_app_container` before starting the WDA session. If missing, throws
|
|
497
513
|
a clear actionable error pointing at `unotest-mobile install`.
|
|
498
514
|
- `SimctlAdapter.isInstalled(udid, bundleId)` and
|
|
499
515
|
`SimctlAdapter.erase(udid)` — exposed on the adapter; ios-utils gains
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unotest/mobile",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "AI-native E2E testing for iOS React Native apps. MCP server + CLI runner + JS-DSL scenarios.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -37,10 +37,10 @@
|
|
|
37
37
|
"sharp": "^0.34.5",
|
|
38
38
|
"zod": "^3.23.8",
|
|
39
39
|
"zod-to-json-schema": "^3.23.5",
|
|
40
|
-
"@unotest/core": "^0.
|
|
41
|
-
"@unotest/protocol": "^0.
|
|
42
|
-
"@unotest/
|
|
43
|
-
"@unotest/
|
|
40
|
+
"@unotest/core": "^0.10.0",
|
|
41
|
+
"@unotest/protocol": "^0.10.0",
|
|
42
|
+
"@unotest/viewer": "^0.10.0",
|
|
43
|
+
"@unotest/dsl": "^0.10.0"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|
|
46
46
|
"mysql2": "^3.0.0",
|