@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.
Files changed (2) hide show
  1. package/CHANGELOG.md +48 -15
  2. 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 *wrong-
66
- keyboard-layout* failure (Cyrillic keyboard eating Latin chars
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
- Required, API_BASE_URL: Required, ...`. Claude Code then surfaced
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
- <service> <bundleId>` immediately after install. Pre-empts SpringBoard
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
- true` flag. Previously the alert lived in SpringBoard (outside the
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
- { clean: true }` flow even when `simctl uninstall` reports "app not
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
- false` override.
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
- Before this, scenarios had no way to dismiss SpringBoard alerts: the
388
- resolver-driven `tap(getByTestId(...))` couldn't reach buttons that
389
- live outside the app process — `ordinal` selectors appeared to match
390
- but the tap landed on the wrong element. Pre-granting permissions via
391
- `xcrun simctl privacy` was the only workaround. MCP exposure (as
392
- `explore_step` actions) lands in a follow-up.
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
- <runtime>` (e.g. `SIM_A_NAME=iPhone 16 @ iOS 17.5`). The runtime
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
- get_app_container` before starting the WDA session. If missing, throws
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.9.1",
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/core": "^0.9.1",
41
- "@unotest/protocol": "^0.9.1",
42
- "@unotest/dsl": "^0.9.1",
43
- "@unotest/viewer": "^0.9.1"
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
  }