@unotest/mobile 0.9.1 → 0.11.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 +48 -15
- package/package.json +6 -25
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,39 @@ 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.11.0] - 2026-08-13
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [eb568a6]
|
|
12
|
+
- Updated dependencies [a195713]
|
|
13
|
+
- Updated dependencies [ce25926]
|
|
14
|
+
- Updated dependencies [5a8e92b]
|
|
15
|
+
- Updated dependencies [d0ae620]
|
|
16
|
+
- Updated dependencies [2a68997]
|
|
17
|
+
- Updated dependencies [c01b72f]
|
|
18
|
+
- Updated dependencies [dea90e9]
|
|
19
|
+
- @unotest/core@0.11.0
|
|
20
|
+
- @unotest/protocol@0.11.0
|
|
21
|
+
- @unotest/viewer@0.11.0
|
|
22
|
+
- @unotest/dsl@0.11.0
|
|
23
|
+
|
|
24
|
+
## [0.10.0] - 2026-08-06
|
|
25
|
+
|
|
26
|
+
### Patch Changes
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [7ed750c]
|
|
29
|
+
- Updated dependencies [574841f]
|
|
30
|
+
- Updated dependencies [337a31c]
|
|
31
|
+
- @unotest/dsl@0.10.0
|
|
32
|
+
- @unotest/protocol@0.10.0
|
|
33
|
+
- @unotest/core@0.10.0
|
|
34
|
+
- @unotest/viewer@0.10.0
|
|
35
|
+
|
|
36
|
+
## [0.9.2] - 2026-06-16
|
|
37
|
+
|
|
38
|
+
Released in lockstep with the rest of the ecosystem. No functional changes.
|
|
39
|
+
|
|
7
40
|
## [0.9.1] - 2026-06-14
|
|
8
41
|
|
|
9
42
|
### Changed
|
|
@@ -62,8 +95,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
62
95
|
all running on the same Mac), the iOS keyboard layer couldn't keep
|
|
63
96
|
up and randomly dropped 1-3 characters from the middle of the string
|
|
64
97
|
— observed live as `petr@volkov.io` → `pr@volkov.io`, `Qwerty34##`
|
|
65
|
-
→ `Qwery34##`. P4 / S8 had only addressed the unrelated
|
|
66
|
-
keyboard-
|
|
98
|
+
→ `Qwery34##`. P4 / S8 had only addressed the unrelated _wrong-
|
|
99
|
+
keyboard-layout_ failure (Cyrillic keyboard eating Latin chars
|
|
67
100
|
wholesale); this race is a separate failure mode that survived.
|
|
68
101
|
- **Fix 1 — `ConnectHardwareKeyboard` pinned OFF on install.**
|
|
69
102
|
The `pinEnglishKeyboard` step (S8) now also writes
|
|
@@ -113,7 +146,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
113
146
|
`npx @unotest/mobile@latest install ...`. The stale global frequently
|
|
114
147
|
had the pre-0.1.4 strict env schema, so the MCP server crashed at
|
|
115
148
|
startup with `Invalid environment. ... INVITE_DEEPLINK_PREFIX:
|
|
116
|
-
|
|
149
|
+
Required, API_BASE_URL: Required, ...`. Claude Code then surfaced
|
|
117
150
|
`-32000 Connection closed` and the agent fell back to draft-mode
|
|
118
151
|
scenario authoring — defeating the entire MCP-driven flow the
|
|
119
152
|
install just bootstrapped.
|
|
@@ -173,7 +206,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
173
206
|
`result.detectedPermissions`.
|
|
174
207
|
- **Pre-grant on install.** When the resolved permissions list is
|
|
175
208
|
non-empty, every service is granted with `simctl privacy <udid> grant
|
|
176
|
-
|
|
209
|
+
<service> <bundleId>` immediately after install. Pre-empts SpringBoard
|
|
177
210
|
permission dialogs (location, motion, photos, …) that would otherwise
|
|
178
211
|
block scenarios on first launch — those dialogs live in SpringBoard,
|
|
179
212
|
not in the app's a11y tree.
|
|
@@ -213,7 +246,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
213
246
|
- **New `alert:` section in `mode: "outline"`.** When a native
|
|
214
247
|
`UIAlertController` is on screen its title, body, and button labels
|
|
215
248
|
appear as the first section of the outline, plus a `_meta.alert_active:
|
|
216
|
-
|
|
249
|
+
true` flag. Previously the alert lived in SpringBoard (outside the
|
|
217
250
|
app's a11y tree) and the agent kept tapping the underlying button
|
|
218
251
|
through the modal — usually the wrong one, sometimes destructive.
|
|
219
252
|
- **Grammar contract.** The `alert:` section and `_meta.alert_active`
|
|
@@ -267,7 +300,7 @@ After the fixes, `run_test` on a freshly-generated exploration returned
|
|
|
267
300
|
is unchanged — keychain reset only fires when the caller explicitly
|
|
268
301
|
opts into a fresh state.
|
|
269
302
|
- Keychain reset is invoked **unconditionally** in the `app_install
|
|
270
|
-
|
|
303
|
+
{ clean: true }` flow even when `simctl uninstall` reports "app not
|
|
271
304
|
installed" — prior-run tokens may still linger, that's the whole
|
|
272
305
|
reason for B5.
|
|
273
306
|
- MCP descriptions for `app_install`'s `clean` parameter and
|
|
@@ -283,7 +316,7 @@ After the fixes, `run_test` on a freshly-generated exploration returned
|
|
|
283
316
|
one tool — `explore_step { action: "tap" | "type" | … }`. The single
|
|
284
317
|
rule: passing `explorationId` records the call into an exploration
|
|
285
318
|
session; omitting it runs the action ad-hoc. There is no `record:
|
|
286
|
-
|
|
319
|
+
false` override.
|
|
287
320
|
- **Alerts (`accept_alert`, `dismiss_alert`) appear here for the first
|
|
288
321
|
time as `explore_step` actions** — not as separate tools. The
|
|
289
322
|
Driver+DSL alert layer landed in P0; this release wires the MCP
|
|
@@ -384,12 +417,12 @@ unchanged.
|
|
|
384
417
|
on UIAlertController, last on action sheet).
|
|
385
418
|
- `readAlert()` — return title + body of the active alert as a string,
|
|
386
419
|
or throw `NoAlertPresentError` if none is on screen.
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
420
|
+
Before this, scenarios had no way to dismiss SpringBoard alerts: the
|
|
421
|
+
resolver-driven `tap(getByTestId(...))` couldn't reach buttons that
|
|
422
|
+
live outside the app process — `ordinal` selectors appeared to match
|
|
423
|
+
but the tap landed on the wrong element. Pre-granting permissions via
|
|
424
|
+
`xcrun simctl privacy` was the only workaround. MCP exposure (as
|
|
425
|
+
`explore_step` actions) lands in a follow-up.
|
|
393
426
|
|
|
394
427
|
## [0.3.0] — 2026-05-15
|
|
395
428
|
|
|
@@ -460,7 +493,7 @@ unchanged.
|
|
|
460
493
|
|
|
461
494
|
- **Simulator runtime disambiguation.** When multiple simulators share
|
|
462
495
|
a name across iOS versions, pin to one via `SIM_A_NAME=<name> @
|
|
463
|
-
|
|
496
|
+
<runtime>` (e.g. `SIM_A_NAME=iPhone 16 @ iOS 17.5`). The runtime
|
|
464
497
|
part is matched as a substring of the friendly runtime name, so
|
|
465
498
|
partial values like `iOS 17` work too. The `Sim "X" not found` error
|
|
466
499
|
now lists all available sims with their runtime.
|
|
@@ -493,7 +526,7 @@ unchanged.
|
|
|
493
526
|
persist.
|
|
494
527
|
- **Pre-launch precondition check.** `WdaDriver.getSession()` now
|
|
495
528
|
verifies `APP_BUNDLE_ID` is installed on the target sim via `simctl
|
|
496
|
-
|
|
529
|
+
get_app_container` before starting the WDA session. If missing, throws
|
|
497
530
|
a clear actionable error pointing at `unotest-mobile install`.
|
|
498
531
|
- `SimctlAdapter.isInstalled(udid, bundleId)` and
|
|
499
532
|
`SimctlAdapter.erase(udid)` — exposed on the adapter; ios-utils gains
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unotest/mobile",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.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
|
+
"author": "Ivan Volkov <ivan@volkov.io>",
|
|
6
7
|
"type": "module",
|
|
7
8
|
"engines": {
|
|
8
9
|
"node": ">=20"
|
|
@@ -37,10 +38,10 @@
|
|
|
37
38
|
"sharp": "^0.34.5",
|
|
38
39
|
"zod": "^3.23.8",
|
|
39
40
|
"zod-to-json-schema": "^3.23.5",
|
|
40
|
-
"@unotest/
|
|
41
|
-
"@unotest/
|
|
42
|
-
"@unotest/
|
|
43
|
-
"@unotest/
|
|
41
|
+
"@unotest/dsl": "^0.11.0",
|
|
42
|
+
"@unotest/viewer": "^0.11.0",
|
|
43
|
+
"@unotest/core": "^0.11.0",
|
|
44
|
+
"@unotest/protocol": "^0.11.0"
|
|
44
45
|
},
|
|
45
46
|
"peerDependencies": {
|
|
46
47
|
"mysql2": "^3.0.0",
|
|
@@ -64,25 +65,5 @@
|
|
|
64
65
|
"tsup": "^8.5.1",
|
|
65
66
|
"tsx": "^4.19.2",
|
|
66
67
|
"typescript": "^5.7.2"
|
|
67
|
-
},
|
|
68
|
-
"scripts": {
|
|
69
|
-
"typecheck": "tsc --noEmit",
|
|
70
|
-
"test": "node --import tsx --test --test-reporter=spec 'src/**/*.test.ts' 'evals/**/*.test.ts'",
|
|
71
|
-
"compile": "tsup",
|
|
72
|
-
"smoke:bundle": "node scripts/smoke-bundle.mjs",
|
|
73
|
-
"check:no-cyrillic": "node scripts/check-no-cyrillic.mjs",
|
|
74
|
-
"check:no-internal-refs": "node scripts/check-no-internal-refs.mjs",
|
|
75
|
-
"verify": "pnpm typecheck && pnpm lint:scenarios && pnpm test",
|
|
76
|
-
"build": "pnpm verify && pnpm compile && pnpm smoke:bundle && pnpm check:no-cyrillic && pnpm check:no-internal-refs",
|
|
77
|
-
"e2e": "tsx src/runner/cli.ts",
|
|
78
|
-
"lint:scenarios": "tsx src/runner/cli.ts lint",
|
|
79
|
-
"mcp": "tsx src/mcp/server.ts",
|
|
80
|
-
"evals:prepare": "tsx evals/prepare.ts",
|
|
81
|
-
"evals:check": "tsx evals/check.ts",
|
|
82
|
-
"evals:run": "tsx evals/run.ts",
|
|
83
|
-
"evals:diff": "tsx evals/diff.ts",
|
|
84
|
-
"evals:bless": "tsx evals/bless.ts",
|
|
85
|
-
"wda:warmup": "tsx scripts/wda-warmup.ts",
|
|
86
|
-
"prepublish:check": "node scripts/prepublish-check.mjs"
|
|
87
68
|
}
|
|
88
69
|
}
|