v0.0.9 — MCP server, Android backend, in-house HID
Warning
Experimental. Ennio is at an early experimental stage. APIs, package
names, internals, and behavior may change without notice between releases.
iOS is the primary target; Android is newer (opt-in via --android) —
its full example suite runs green and stable on CI, but it has seen less
real-world use. The 0.0.x line is a public preview, not a stability commitment.
The biggest release so far: ennio grows an Android backend, an MCP server so AI agents can drive a device through the same pipeline as test flows, an in-house HID layer that drops the last external dependency, and a rewritten CLI. Install is now global-first:
npm install -g @reactiive/ennio.
MCP server
ennio mcp— serve ennio over the Model Context Protocol (stdio). An agent reads the screen (ennio_describe), decides, and acts (ennio_tap,ennio_swipe,ennio_input_text, …) through the same find → settle → actuate pipeline a test run uses; taps and swipes always go through the HID driver, never a passthrough (#59)- Versioned tool contract — structured
{ ok, data | error }envelopes on every tool, one selector model (testID|text| normalized[0,1]point), capability negotiation viaennio_status, side-effect-honestreadOnlyflags — all enforced by an executable conformance suite (#59) - Tool-agnostic by design: works identically with Claude Code, Cursor, Cline, or a hand-rolled client (#59)
Android backend (opt-in)
--android(orENNIO_PLATFORM=android) — drive an emulator/device over adb with in-process agent injection: deterministic JVMTI attach on debuggable builds, ptrace remote-dlopen on non-debuggable release builds (#52)- Focus-identity tracking, regex text matchers, and a network-idle submit gate in the Java agent (#58)
- Full 40-flow example suite green and stable on CI — three consecutive zero-retry runs; injection rides out emulator soft-lock windows with socket-bind verification and escalating relaunch backoff (#60)
In-house HID
- idb_companion is gone. Touches are posted by
enniohid, an in-house helper that links Xcode's own CoreSimulator / SimulatorKit and posts Indigo HID events directly — same pipeline as a physical finger, one persistent process per run, ~5 ms per event (#46)
New CLI
- Rewritten command-line experience: animated live view while flows run, global-install-ready, update notice, and crash reports (#56)
- Flags rationalized: app reuse is now default-on between flows (soft-reset instead of full relaunch — much faster suites);
--disable-reuse-appopts out (#54) - Fast grey-box profile:
--disable-animations+ reuse-app + settle tightening (#51)
Reliability
- iOS keyboard-swallow + autocorrect fixes — the Bluesky e2e suite runs 17/17 (#53)
- TCC permission grant that sticks, plus a loud warning when cross-process AX is blind
- Tab recovery asks the app for its tab bar instead of guessing from a name list
Docs
- READMEs refreshed: global install (
npm install -g @reactiive/ennio) instead of a devDependency, MCP section, full CLI command list, corrected injection wording (SIMCTL_CHILD_*, not simulator-wide env), current Android status (#55, #61)
Full Changelog: v0.0.8...v0.0.9