91 Commits

Author SHA1 Message Date
Michał Pierzchała 37d1faf3ff 0.3.5 v0.3.5 2026-02-13 19:24:38 +01:00
Michał Pierzchała 0b5586fad9 Add open --relaunch and persist replay semantics (#52)
* Add open --relaunch and persist replay semantics

* Update agent-device skill docs for open --relaunch

* Disambiguate relaunch and save-script examples

* Support non-hierarchical deep links in open target detection
2026-02-13 19:21:25 +01:00
Michał Pierzchała 8cef2a61e0 Add deep-link URL support to open command (#53)
* Add deep-link URL support to open command

* Update agent-device skill docs for deep-link open
2026-02-13 18:49:00 +01:00
Michał Pierzchała e3b1aa6892 CI: add manual iOS runner prebuild cache for iOS job (#50)
* ci: add manual iOS runner prebuild cache for iOS workflow

* ci: simplify manual iOS prebuild workflow

* ci: pin cache actions in iOS workflows

* ci: fix iOS workflow env paths for parser compatibility

* ci: increase daemon timeout for iOS boot preflight

* ios: harden simulator state timeout and reuse preflight session

* ci: remove redundant iOS boot preflight step

* ios: retry transient simctl launch failures on simulator

* ci: pin iOS integration test target to resolved 26.2 simulator

* ci: harden iOS prebuild cache keys and remove derived-data copy path

* ci: simplify iOS workflow caching and drop redundant prebuild workflow

- Remove standalone ios-runner-prebuild.yml (redundant — ios.yml builds on cache miss)
- Switch from actions/cache/restore to actions/cache (auto-saves on miss)
- Drop restore-keys and -stable suffix (no longer needed without prebuild workflow)
- Remove UDID resolution step (test falls back to --platform ios)
- Use point-free shouldRetry for isTransientSimulatorLaunchFailure

Co-authored-by: Cursor <cursoragent@cursor.com>

* ios: increase simctl launch retry budget for CI simulators

SpringBoard can take several seconds after boot to accept app launches.
Increase from 3 attempts / 500ms–2s to 5 attempts / 1s–5s to give CI
simulators enough time.

Co-authored-by: Cursor <cursoragent@cursor.com>

* ios: use deadline-based retry for simulator app launch

The fixed-attempt retry (5 attempts, ~12s window) is too short for CI
simulators where SpringBoard needs 30-60s after boot to accept app
launches — especially when the build step is cached and provides zero
warm-up time.

Switch to a deadline-based approach matching ensureBootedSimulator:
- Default 30s timeout (configurable via AGENT_DEVICE_IOS_APP_LAUNCH_TIMEOUT_MS)
- CI sets 60s to handle cold-boot scenarios
- maxAttempts set high (30) so the deadline is the real limit

Co-authored-by: Cursor <cursoragent@cursor.com>

* ci(ios): keep tests platform-based and stabilize simulator selection

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 18:47:39 +01:00
Michał Pierzchała a73912003f 0.3.4 v0.3.4 2026-02-13 14:36:33 +01:00
Michał Pierzchała 8bc1675add Heal numeric get-text drift in replay update (#51)
* Refine selector resolution and simplify replay healing

* Address review feedback on selector internals

* Heal numeric get-text drift in replay update

* Remove redundant find and dead assignment in selector internals

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 14:35:45 +01:00
Michał Pierzchała 2dd2cad6fd 0.3.3 v0.3.3 2026-02-13 13:11:28 +01:00
Michał Pierzchała 172968c0e1 fix: refine selector resolution and simplify replay healing (#49)
* Refine selector resolution and simplify replay healing

* Address review feedback on selector internals
2026-02-13 13:05:07 +01:00
Michał Pierzchała 733bd8d84f 0.3.2 v0.3.2 2026-02-12 17:56:35 +01:00
Michał Pierzchała 1cf54a265c Boot, reinstall commands, diagnostics overhaul, and review fixes (#48)
* Refine reinstall flow and add agent-focused coverage

* Avoid duplicate readiness preflight in open flow

* Document boot and reinstall in website docs and skill

* Refine boot docs: troubleshooting-only and non-CI wording

* Fix duplicate find matching, add IOS_TOOL_MISSING reason, DRY retry log env check

- Remove redundant findNodeByLocator call in find handler; reuse
  bestMatches from the ambiguity check instead of scanning nodes twice.
- Add IOS_TOOL_MISSING boot failure reason so xcrun/simctl absence gets
  a specific diagnostic hint instead of generic BOOT_COMMAND_FAILED.
- Extract isEnvTruthy helper into retry.ts and replace duplicated
  RETRY_LOGS_ENABLED parsing in ios/index.ts and android/devices.ts.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-12 17:54:04 +01:00
Michał Pierzchała a0ce6f1df2 feat: reinstall command for reuse and agent ergonomics (#47)
* Refine reinstall flow and add agent-focused coverage

* Avoid duplicate readiness preflight in open flow

* Document boot and reinstall in website docs and skill

* Bound iOS boot commands and enforce runCmd timeouts

* Align boot readiness with timeout profiles across platforms

* Refine boot docs: troubleshooting-only and non-CI wording

* Clarify open vs boot fallback guidance
2026-02-12 17:17:56 +01:00
Michał Pierzchała 3ddd3a1ef5 Complete issue #39 boot diagnostics, telemetry, and boot command (#46)
* Complete issue #39 phase diagnostics telemetry and boot command

* Address review findings for boot diagnostics and command gating

* Use agent-device boot preflight in iOS CI workflow

* Run iOS boot preflight via source CLI in CI
2026-02-12 15:00:27 +01:00
Michał Pierzchała 70ab1a8e97 Improve Android open fallback, find ambiguity handling, and replay diagnostics (#45)
* Improve Android open fallback, find ambiguity handling, and replay diagnostics

* Fix iOS integration step to use unique selector for General
2026-02-12 14:51:17 +01:00
Michał Pierzchała d0525cd3f1 0.3.1 v0.3.1 2026-02-12 13:52:58 +01:00
Michał Pierzchała 204184ac1e Improve boot readiness retries and normalized diagnostics (#41)
* Add boot diagnostics classification and deadline-based boot retries

* Fix TypeScript narrowing in boot diagnostics error paths

* update docs and cleanup

* Stabilize iOS integration assertion for Settings General page
2026-02-12 13:51:54 +01:00
Michał Pierzchała 835b59f9f6 Improve integration failure diagnostics (#40) 2026-02-12 09:53:02 +01:00
Michał Pierzchała 613974ab71 Handle iOS system blocker alerts in snapshots (#38) 2026-02-11 19:05:19 +01:00
Zhongjin Lu 31a639ab5f feat: add version flags and unify version lookup (#44)
Co-authored-by: Zhongjin Lu <zhongjin.lu@mondorobotics.com>
2026-02-11 17:02:47 +01:00
Michał Pierzchała 6a064f229d fix: update IPHONEOS_DEPLOYMENT_TARGET to 15.6 (#42) 2026-02-11 10:07:58 +01:00
Michał Pierzchała a48d840f6c 0.3.0 v0.3.0 2026-02-10 16:32:05 +01:00
Zhongjin Lu f56dda6c9e fix(android): parse uiautomator XML attributes with single or double quotes (#37)
* fix(android): parse uiautomator XML attributes with single or double quotes

* fix(android): harden hierarchy parser and tighten tests

---------

Co-authored-by: Zhongjin Lu <zhongjin.lu@mondorobotics.com>
Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-02-10 16:27:43 +01:00
Michał Pierzchała 8c50cee10d chore: use macos-26 runner for ios integration test; ubuntu for smoke (#34)
* chore: use macos-26 runner for ios integration test; ubuntu for smoke

* revert smoke test

* update test for iOS 26.2

* restart sim after timeout

* fixup timeout
2026-02-10 10:41:08 +01:00
Michał Pierzchała bb23711d10 docs: simplify and reconcile AGENTS guide (#35) 2026-02-09 21:20:59 +01:00
Michał Pierzchała 8e88eb552a fix: android race condition for snapshot dump (#33)
* fix: android race condition for snapshot dump

* ci

* split workflows

* udpate names
2026-02-09 20:54:13 +01:00
Michał Pierzchała db339c9596 fix: harden startup/teardown behavior on iOS (#32) 2026-02-09 19:51:28 +01:00
Michał Pierzchała 4aed3fba72 fix: support TouchableOpacity as [other] on iOS when has content (#31)
* fix: support TouchableOpacity as [other] on iOS when has content

* update snapshot ios
2026-02-09 19:07:04 +01:00
Michał Pierzchała c470137671 0.2.6 v0.2.6 2026-02-09 13:29:17 +01:00
Michał Pierzchała 2e8680518d fix: iOS snapshot not showing password fields (#29) 2026-02-09 13:29:05 +01:00
Michał Pierzchała ab41eb1566 0.2.5 v0.2.5 2026-02-09 12:39:40 +01:00
Michał Pierzchała 828284d7e3 fix: set min iOS deployment target to 15.6 (#27)
* fix: set min iOS deployment target to 15.6

* increase timeout for iOS
2026-02-09 12:39:02 +01:00
Michał Pierzchała d2954f6fd3 fix: missing long-press on iOS simulator (#26)
* feat:  for self-healing e2e tests;  assertions

* fix: support long-press on iOS simulators via XCTest runner

The long-press command was failing on iOS simulators because dispatch.ts
called interactor.longPress() which mapped to a stub in ios/index.ts
that always threw UNSUPPORTED_OPERATION. Unlike press, type, fill, etc.,
the long-press case was missing the iOS simulator routing through the
XCTest runner.

Rather than adding yet another platform branch in dispatch.ts, this
refactors the Interactor abstraction to absorb runner routing internally.
getInteractor() now accepts an optional RunnerContext; when the device is
an iOS simulator, it returns an interactor whose tap/longPress/focus/
type/fill/scroll/scrollIntoView methods route through
runIosRunnerCommand. This removes 7 scattered if-ios-simulator branches
from dispatch.ts, making it impossible to forget runner routing for
future commands.

Changes:
- Swift runner: add longPress command type + longPressAt helper using
  XCUICoordinate.press(forDuration:)
- runner-client.ts: add longPress to RunnerCommand type + durationMs field
- interactors.ts: add RunnerContext type, createIosSimulatorInteractor()
  that routes through the XCTest runner, move invertScrollDirection here
- dispatch.ts: pass RunnerContext to getInteractor, remove all iOS sim
  branching for interactor commands (-90 lines)

Co-authored-by: Cursor <cursoragent@cursor.com>

* restore attempts

* refactor: unify iOS interactor, remove dead input stubs

Since runnerContext is always passed and the capability matrix ensures
iOS only runs on simulators in v1, the two iOS interactor code paths
collapse into one: shared methods (open, close, screenshot) plus runner
overrides spread on top. No branch needed.

This deletes 7 dead iOS input stubs from ios/index.ts (pressIos,
longPressIos, focusIos, typeIos, fillIos, scrollIos, scrollIntoViewIos)
that only ever threw UNSUPPORTED_OPERATION errors.

Co-authored-by: Cursor <cursoragent@cursor.com>

* cleanup

* fixup save-script

* update

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-09 12:06:26 +01:00
Michał Pierzchała 1ecbec9012 feat: replay --save-script for self-updating e2e tests; add it assertions; add DSL with selectors (#24)
* feat:  for self-healing e2e tests;  assertions

* rework ad scripts
2026-02-09 11:01:19 +01:00
Michał Pierzchała 9a3570fa1c feat: Daemon modularization + capability-gated command routing + CI/test pipeline (#20)
* feat: Daemon modularization + capability-gated command routing + CI/test pipeline updates

* update android test

* fix arch

* no serial

* fixup tests locally; update runner on CI

* increase timeout

* drop unnecessary node build
2026-02-08 15:20:59 +01:00
Anton Kuznetsov d3ac97dbcd Update README with skill installation and session info (#19)
Add usage instructions for adding skills and session commands.
2026-02-06 18:57:50 +01:00
Michał Pierzchała 60324e0269 0.2.4 v0.2.4 2026-02-06 12:48:46 +01:00
Michał Pierzchała ebf45f1e79 feat: record start [path], screenshot [path], --record-json (#18) 2026-02-06 12:44:26 +01:00
Michał Pierzchała 8f653b5a5c 0.2.3 v0.2.3 2026-02-06 12:16:37 +01:00
Michał Pierzchała d8440a6645 fix: make fill clear input and progressively fill the input (#17)
* fix: make fill clear input and progressively fill the input

* fixup ios

* improve text fill reliability
2026-02-06 12:16:20 +01:00
Michał Pierzchała 22bfcee0dc feat: normalize Android snapshots (#16) 2026-02-06 09:26:30 +01:00
Abdulrahman 8130fff678 docs: remove broken missing-features reference from SKILL.md (#14) 2026-02-05 19:37:23 +01:00
Michał Pierzchała 6d2d157888 0.2.2 v0.2.2 2026-02-05 18:09:20 +01:00
Michał Pierzchała 67fa14c70a feat: check parent when matched element is not hittable (#13)
* feat: check parent when matched element is not hittable

* note android

* clarify
2026-02-05 18:08:46 +01:00
Jano 992959c23e feat(ios): add pinch gesture for zoom on iOS simulators (#11)
- Add 'pinch' CLI command: pinch <scale> [x y] (scale > 1 zoom in, < 1 zoom out)
- Implement in dispatch, runner-client (RunnerCommand + scale param), Swift runner
- Use double-tap + drag workaround for map zoom (tap center, drag up/down)
  instead of XCUITest pinch(withScale:velocity:) which pans on map views
- Update commands.md and agent-device skill with pinch usage and best practices
- Fix skill reference: recording.md -> video-recording.md

Co-authored-by: Jano Detzel <jano.detzel@ewe-go.de>
2026-02-05 17:51:36 +01:00
Michał Pierzchała e63cf2ab33 feat: android open --activity flag (#12) 2026-02-05 17:40:26 +01:00
Michał Pierzchała e84612a393 feat: docs (#7)
* feat: docs v1

* update wording

* update action
2026-02-05 15:25:52 +01:00
Alex Astrum b03f867395 fix: skill should work, even if the npm package is not installed (#1)
Added installation instructions for agent-device.
2026-02-05 11:13:33 +01:00
Tsung-Han Yu 83e4c4db88 Update README with correct GitHub link (#2)
Co-authored-by: Michał Pierzchała <thymikee@gmail.com>
2026-02-05 11:12:54 +01:00
Michał Pierzchała a478173802 chore: v0.2.1 v0.2.1 2026-02-05 09:53:03 +01:00
Michał Pierzchała 105b61e79c fix: drop 300ms runner timeout 2026-02-05 09:49:16 +01:00
Michał Pierzchała 7517513853 update skills 2026-02-05 08:23:34 +01:00