Commit Graph

806 Commits

Author SHA1 Message Date
Michał Pierzchała f2b0262abc 0.11.6 v0.11.6 2026-04-02 12:09:56 +02:00
Michał Pierzchała cd44582d40 fix: tighten dogfood snapshot and session UX (#350)
* fix: tighten dogfood snapshot and session UX

* fix: improve iOS simulator network dump recovery

* fix: honor simulator device set in iOS log recovery
2026-04-02 10:02:34 +02:00
Michał Pierzchała b4cfe3b638 fix: harden Android network dump recovery (#348)
* fix: harden android network dump recovery

* refactor: centralize app log network recovery

* fix: only mark android app logs active after attach
2026-04-02 07:59:54 +02:00
Michał Pierzchała 413f67cdba feat: add Android perf cpu and memory sampling (#349)
* feat: add Android perf cpu and memory sampling

* fix: degrade Android perf metrics individually
2026-04-02 07:55:19 +02:00
Michał Pierzchała 0bdfde1d95 0.11.5 v0.11.5 2026-04-01 21:34:28 +02:00
Michał Pierzchała ab30308989 refactor: simplify Android snapshot hinting pipeline (#347)
* refactor: simplify android snapshot hinting

* refactor: clarify android snapshot source mapping
2026-04-01 21:34:05 +02:00
Michał Pierzchała 5e788f6534 Refactor command handlers into specialized functions (#346)
* fix: document magic thresholds, fix BFS perf, and add edge-case tests

Address code review findings from #345:

- Document all undocumented heuristic constants across 11 files with
  rationale comments (freshness windows, retry delays, stale detection
  thresholds, safe-band zones, viewport-sized checks, scroll indicator
  boundaries, network log scan radii, nav subtree detection thresholds)
- Fix O(n²) BFS in ui-hierarchy.ts findScopeNode — replace shift() with
  index-based queue traversal
- Remove unused variable in ios/devices.ts listAppleDevices
- Document bundletool cache thread-safety assumption in app-lifecycle.ts
- Add 7 edge-case tests to mobile-snapshot-semantics.test.ts: zero-width
  viewport, zero-height viewport, negative coordinates, exact boundary
  visibility (both visible and outside cases)
- Add 2 boundary-condition tests to output.test.ts for nav subtree
  detection thresholds (below node floor, below duplicate floor)

All 1112 tests pass.

https://claude.ai/code/session_014aYgMag5ziyhXZoXcP9a7i

* refactor: decompose large handler functions for readability

Extract handler functions from three monolithic files:
- dispatch.ts: 13 command handlers from 786-line switch statement
- request-router.ts: split executeSessionRequest into focused helpers
- session-observability.ts: split into per-command handler functions

https://claude.ai/code/session_014aYgMag5ziyhXZoXcP9a7i

* test: add malformed snapshot data coverage for buildSnapshotState/buildSnapshotVisibility

Closes the remaining acceptance gap in #345: tests for undefined nodes,
sparse node fields, filtered-vs-unfiltered comparisonSafe semantics,
raw/macos-helper backend bypass, and scroll-hint visibility detection.

https://claude.ai/code/session_014aYgMag5ziyhXZoXcP9a7i

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-04-01 21:32:55 +02:00
Michał Pierzchała 6ec465a3d7 fix: preserve android snapshot visibility hints (#343) 2026-04-01 21:01:13 +02:00
Michał Pierzchała 7df452b3b5 feat: add rotate command for iOS and Android (#344)
* feat: add device rotation command

* fix: simplify rotate command handling
2026-04-01 20:34:56 +02:00
Michał Pierzchała 8df45b69a8 fix: make snapshot refs visible-first (#337)
* fix: make snapshot refs visible-first

* fix: handle zero-height visible rects

* refactor: simplify scrollintoview success handling

* feat: hint hidden scroll content in snapshots

* refactor: simplify snapshot output helpers

* feat: add hidden scroll-area hints to snapshots

* refactor: keep scroll containers in interactive snapshots

* perf: reuse Android snapshot tree for scroll hints

* refactor: trim hidden scroll hint scope

* refactor: unify mobile visible-first snapshot semantics

* fix: suppress noisy system scroll-container labels

* refactor: unify scroll indicator heuristics

* refactor: trim android hinting overhead

* fix: avoid viewport-sized ancestor promotion for ref taps

* refactor: dedupe viewport helpers and clarify hint naming
2026-04-01 19:00:02 +02:00
Michał Pierzchała 904be86019 fix: serialize first-session open requests per device (#341) 2026-04-01 18:53:27 +02:00
Michał Pierzchała 63423dacaa fix: harden iOS simulator automation stability (#340)
* fix: harden iOS simulator automation stability

* refactor: simplify automation hardening follow-ups
2026-04-01 17:57:52 +02:00
Michał Pierzchała 3d736ebba1 docs: use GIF for README video (#339)
* update readme

* chore: update demo link

* chore: use gif
2026-04-01 16:40:08 +02:00
Michał Pierzchała fe27c50408 chore: update demo link 2026-04-01 16:16:44 +02:00
Michał Pierzchała cf34583f47 fix: make Android snapshot freshness recovery internal (#335)
* feat: add --wait-stable for Android AX tree and --first/--last for find

Address the #1 token efficiency issue on Android: stale accessibility
trees after navigation. `snapshot --wait-stable <ms>` polls until two
consecutive uiautomator dumps match (tree stabilized) or the timeout
expires, eliminating retry loops caused by AX lag after screen transitions.

Also adds `find --first` / `find --last` flags to disambiguate when
multiple elements match, avoiding the fallback to raw snapshot +
coordinate taps that burned 4-6 extra tool calls.

https://claude.ai/code/session_01FzX5t9qATyT9iWnYjssShC

* cleanup: simplify find disambiguation and tighten flag descriptions

- Use consistent array reassignment for --first/--last instead of
  .length mutation
- Inline FIND_DISAMBIGUATE_FLAGS (only 2 entries, no reuse)
- Shorten --wait-stable usage description

https://claude.ai/code/session_01FzX5t9qATyT9iWnYjssShC

* docs: add flag plumbing checklist and --wait-stable/--first/--last guidance

Add a 7-step checklist to AGENTS.md for adding new CLI flags — this was
the main non-obvious cost in the implementation (7 files for one flag).

Update exploration skill to recommend --wait-stable for Android AX
staleness recovery and --first/--last for ambiguous find matches.

https://claude.ai/code/session_01FzX5t9qATyT9iWnYjssShC

* docs: improve skill clarity for weaker models

- Split "Most common mistake" into three labeled subsections (stale
  refs, Android AX lag, React Native overlays) so each is scannable
  independently
- Convert Android AX recovery from prose into a numbered list
- Add --wait-stable to debugging.md for consistency with exploration.md
- Replace vague "meaningful UI changes" with concrete triggers
- Tighten QA recovery sentence that was getting unwieldy

https://claude.ai/code/session_01FzX5t9qATyT9iWnYjssShC

* fix: make Android snapshot freshness recovery internal

* fix: tighten Android freshness baselines

* docs: clarify Android freshness tradeoffs

* docs: clarify empty interactive freshness warning

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-04-01 14:22:39 +02:00
Michał Pierzchała 31b80ff436 docs: add demo video to the repo (#338)
* docs: add demo video to the repo

* update readme
2026-04-01 12:34:24 +02:00
Michał Pierzchała 94c817ea0b fix: restore legacy iOS device discovery for pre-iOS 17 devices (#336)
* fix: restore legacy iOS device discovery

* perf: parallelize Apple legacy device fallback
2026-04-01 12:24:38 +02:00
Michał Pierzchała 7da4c2d45b 0.11.4 v0.11.4 2026-04-01 07:44:47 +02:00
Michał Pierzchała 94966abefc fix: tighten Expensify Android flow guidance (#330)
* fix: tighten agent-device expensify flow guidance

* fix: tighten Expensify Android flow guidance

* fix: surface diff snapshot stale warnings

* fix: clarify inactive network log recovery
2026-04-01 07:44:22 +02:00
Michał Pierzchała f7f7ce531f chore: add icon for iOS UITest runner (#328)
* chore: add icon for iOS UITest runner

* chore: tighten uitest runner icon assets

* chore: prefer jpg for uitest runner icon
2026-03-31 21:03:57 +02:00
Michał Pierzchała 0bcfa678ca fix: prune unlabeled groups from snapshot text output (#329)
* fix: prune unlabeled groups from snapshot text output

* fix: remove dead snapshot formatter state
2026-03-31 21:03:20 +02:00
Michał Pierzchała 8aea3e0902 feat: improve snapshot diff and network exploration ergonomics (#326)
* feat: improve snapshot diff and network exploration ergonomics

* refactor: tighten snapshot diff guidance and Android log correlation
2026-03-31 19:37:26 +02:00
Michał Pierzchała 58e64933fb feat: add lightweight upgrade check (#324)
* feat: add lightweight upgrade check

* refactor: simplify upgrade check

* refactor: remove update-check test DI
2026-03-31 15:20:27 +02:00
Michał Pierzchała 7236b519cf 0.11.3 v0.11.3 2026-03-31 14:44:09 +02:00
Michał Pierzchała 7b9c02db81 fix(android): tolerate non-zero uiautomator dump exits (#323)
* fix(android): tolerate non-zero uiautomator dump exits

* test(android): cover snapshot fallback retry
2026-03-31 14:43:49 +02:00
Michał Pierzchała 8467af80e2 fix: avoid iOS fill runner tree scan (#321) 2026-03-31 09:45:14 +02:00
Michał Pierzchała ce378593ac 0.11.2 v0.11.2 2026-03-30 12:38:26 +02:00
Michał Pierzchała 95f8071696 test: drop continue-on-error from CI jobs 2026-03-30 12:03:47 +02:00
Michał Pierzchała 497a54deb7 test: expand replay coverage and CI reporting with JUnit (#317)
* test: add benchmark .ad scripts for iOS and Android (02-06)

Add 10 new replay scripts covering deep navigation, scroll discovery,
text input & keyboard, app lifecycle, and swipe gestures for both
iOS simulator and Android emulator. Each script combines multiple
command types (snapshot, click, wait, is, find, get, scroll,
scrollintoview, swipe, back, home, keyboard, screenshot, appstate)
to provide comprehensive baseline coverage for version-over-version
comparison.

https://claude.ai/code/session_01VkHLzVc7NULQFaWHnhuBCm

* test: move replay benchmarks out of CI suite

* test: trim replay benchmark script comments

* test: relaunch replay app opens

* fix: stop focusing iOS simulator for screenshots

* fix: open Simulator app on cold boot

* test: trim iOS cold boot coverage

* test: move replay benchmarks into integration suites

* ci: align Android emulator with local setup

* ci: raise iOS replay daemon timeout

* test: add replay junit reports

* ci: use supported Android emulator profile

* fix: stabilize replay cleanup and Android CI flows

* test: trim flaky replay coverage

* fix: exclude replay tests from daemon request timeout

* test: relax android scroll discovery replay

* refactor: rename ios simulator app opener

* ci: remove obsolete android replay timeout override

* test: remove duplicate android replay opens

* test: relax ios swipe replay assertion

* ci: move full replay suites to nightly

* ci: extract shared replay workflow setup

* ci: fail nightly replay jobs on test errors

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-03-30 11:45:49 +02:00
Michał Pierzchała 40425fce80 refactor: P2 cleanup — extract shared utils, inline trivial files, safety guards (#315)
* refactor: DRY violations and cleanup from codebase review (P2)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: complete P2 items — extract parsing, unify transport, consolidate recording, handler utils

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address P2 review feedback — restore daemonBaseUrl diagnostic, remove dead export

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: restore leaf seams in daemon cleanup

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 21:12:45 +02:00
Michał Pierzchała 7a5e1dca75 refactor: P3 polish — Interactor type safety, error response builder, OXC (#316)
* refactor: polish improvements from codebase review (P3)

- Export Interactor type and add `satisfies Interactor` to both return
  objects in getInteractor() for compile-time completeness checking
- Create errorResponse/successResponse builder in handlers/response.ts
  and adopt it in 5 representative handler files (find, record-trace,
  interaction-press, session-deploy, snapshot-wait)
- Add ESLint with typescript-eslint, fix unused imports and trivial
  lint issues, configure rules to warn for stylistic patterns

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: complete P3 items — consolidate runner files, document macOS exports, standardize dispatch

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: address P3 review feedback — remove invalid ESLint rules, dead code, unused export

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* chore: replace eslint and prettier with oxc

* chore: tighten oxc config and upgrade typescript

* refactor: extract ios runner contract helpers

* docs: tighten agent guidance and add check scripts

* fix: resolve post-rebase validation issues

* fix: remove shell interpolation from metro launcher

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 20:43:24 +02:00
Michał Pierzchała 017ac817ff refactor: P1 structural improvements — move interactors to core, consolidate selectors, rename client-shared (#314)
* refactor: structural improvements from codebase review (P1)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: complete P1 items — split CLI commands, decompose handlers, consolidate artifacts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* refactor: simplify CLI and daemon facades

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 12:53:15 +02:00
Michał Pierzchała 0fed800eee fix: avoid focusing iOS simulator window (#319) 2026-03-28 19:39:14 +01:00
Michał Pierzchała 876f091c00 feat: close macOS parity gaps (#311)
* feat: close macos parity gaps

* fix: support targeted macOS menubar app snapshots

* chore: clarify menubar fallback heuristics

* chore: address review nits

* fix: complete macOS parity flow
2026-03-28 19:06:52 +01:00
Michał Pierzchała 8888dd5d08 fix: address P0 safety issues from codebase review (#318)
- Add unhandledRejection handler in daemon to prevent silent crashes
- Add timeout handling to runCmdStreaming matching runCmd pattern
- Fix port allocation race in getFreePort by resolving inside close callback
- Replace synchronous appendFileSync with async appendFile in logChunk

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 18:56:54 +01:00
Michał Pierzchała 48e55dbd6f fix: address P0 safety issues from codebase review (#313)
- Add unhandledRejection handler in daemon to prevent silent crashes
- Add timeout handling to runCmdStreaming matching runCmd pattern
- Fix port allocation race in getFreePort by resolving inside close callback
- Replace synchronous appendFileSync with async appendFile in logChunk

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 18:55:53 +01:00
Michał Pierzchała 153ac82c78 0.11.1 v0.11.1 2026-03-27 19:39:00 +01:00
Michał Pierzchała f7e1e7a89c refactor: split touch interaction handlers (#310)
* refactor: split touch interaction handlers

* refactor: extract touch reference frame helpers
2026-03-27 19:13:29 +01:00
Michał Pierzchała f13ad2054d feat: add screenshot ref overlays (#307)
* feat: add screenshot ref overlays

* fix: refresh overlay refs from a fresh snapshot

* chore: tighten screenshot overlay plumbing

* fix: improve screenshot overlay targeting

* docs: trim screenshot overlay docs

* feat: add overlay ref centers

* docs: trim fallback guidance

* fix: improve android overlay labels
2026-03-27 19:04:34 +01:00
Michał Pierzchała 86674d2109 docs: clarify commit and PR title prefixes for agents (#309)
* docs: clarify commit and PR title prefixes for agents

* docs: default agents to ready-for-review PRs
2026-03-27 18:05:12 +01:00
Michał Pierzchała 44db0ca1cb refactor: remove remaining test DI seams (#304)
* refactor: remove remaining test DI seams

* refactor: remove xctestrun test seam

* chore: address PR review nits
2026-03-27 17:51:51 +01:00
Michał Pierzchała d5cbec08fc [codex] Speed up Apple CI jobs (#305)
* perf: speed up apple ci jobs

* chore: address ci review feedback

* chore: unify apple runner build scripts
2026-03-27 17:51:13 +01:00
Michał Pierzchała d9d94f0f5a [codex] close iOS runner responses gracefully (#306)
* fix: close iOS runner responses gracefully

* fix: close runner connection after send
2026-03-27 17:48:20 +01:00
Michał Pierzchała f984a655ce chore: add CI replay retries (#308) 2026-03-27 17:45:42 +01:00
Michał Pierzchała 7c36b0f821 0.11.0 v0.11.0 2026-03-27 16:50:53 +01:00
Michał Pierzchała 9eb0604065 refactor: migrate session.ts orchestrator to vitest + drop node:test (#284) (#302)
Remove all test-only DI parameters from handleSessionCommands (signature
drops from ~30 params to 5: req, sessionName, logPath, sessionStore,
invoke) and from the remaining sub-handlers (session-inventory,
session-observability, session-replay, session-close, session-state).

Migrate all 89 remaining node:test unit test files to vitest. Tests that
passed DI overrides now use vi.mock instead. Update vitest.config.ts to
include *.test.ts alongside *.vitest.ts, and remove the dual-runner
node --test from package.json scripts.

Add a permanent CI lint guard that fails if optional typeof DI seams
reappear in production code.

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 16:39:59 +01:00
Michał Pierzchała fa212489d4 chore: remove duplicate publish build hook (#301) 2026-03-27 15:28:20 +01:00
Michał Pierzchała ac50381270 docs: clarify iOS runner protocol contract (#300) 2026-03-27 15:27:56 +01:00
Michał Pierzchała aae1771c54 refactor: remove JS test wrappers, run .ad replays directly on CI (#299)
* refactor: remove JS test wrappers, run .ad replay suites directly on CI

The platform JS test files (ios.test.ts, android.test.ts, macos.test.ts)
were thin wrappers that shelled out to `agent-device test` and asserted
on JSON counts. Since the CLI already exits non-zero on failure, the
wrappers added no value. CI now invokes the replay suites directly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: add local replay entrypoints and restore physical device test

- Add pnpm scripts for each replay suite (test:replay:ios,
  test:replay:ios-device, test:replay:android, test:replay:macos)
  so local runs still exercise platform replays
- Restore physical-device iOS replay step in CI workflow
  (conditional on IOS_UDID variable)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 15:24:07 +01:00
Michał Pierzchała acee54b697 refactor: migrate session sub-handlers + request-router from test-only DI to vitest mocking (#295)
Remove ~35 DI parameters from session-close, session-open, session-deploy,
session-device-utils, session-runtime, record-trace-recording, and
request-router. All sub-handlers now use direct imports instead of
threaded typeof params. Tests rewritten from node:test to vitest with
vi.mock() replacing manual dependency injection.

Closes #283

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 15:06:39 +01:00