Skip to content

v0.0.9 — MCP server, Android backend, in-house HID

Choose a tag to compare

@enzomanuelmangano enzomanuelmangano released this 09 Jun 19:51
· 29 commits to main since this release
9431d05

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 via ennio_status, side-effect-honest readOnly flags — 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 (or ENNIO_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-app opts 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