Skip to content

Releases: lvlrSajjad/simframe

v0.23.1

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 05 Oct 15:08

simframe 0.23.1 — on npm as simframe@0.23.1 and in the official MCP Registry as io.github.lvlrSajjad/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

Changes

  • A keyboard key never competes with an app control of the same name
  • Repeats skip background rows; a bare record count reads as loading; evidence leads with the row turned on
  • A centred dialog marks the background below it as well as above
  • After a sweep or a late arrival, the header says the screen moved
  • A blind type after tapping a field reads that field back; waitFor says how long it held
  • Delegating to the driver is the skill's default; a wizard recipe; the driver reports a brief the app contradicts

Full history: v0.23.0...v0.23.1

v0.23.0

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 05 Oct 15:08

simframe 0.23.0 — on npm as simframe@0.23.0 and in the official MCP Registry as io.github.lvlrSajjad/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

Changes

  • Screen header: a small text change is not 'NOT MOVED SINCE THE ACTION'
  • Fill a form in one script: a field beats its own caption, refs survive the keyboard
  • Typing a form is 3x faster; a partial name never flips a switch
  • Store: readable by this account only
  • Matching: synonyms are whole words, never beat the caller's own word, and exact case breaks a tie
  • simframe do accepts a script inline, as the skill shows
  • Result strings say what happened
  • A map recalled from another session never says 'chain without looking again'
  • An unlabeled multiline field is a field: listed, named by its caption, reachable by type and fill
  • Sweep says why it stopped and whether it found its target
  • scrollTo with its target already in view returns at once, and ok
  • A relaunch forgets what was typed: no 'value is gone' on a fresh form
  • Overlap is reported when another layer shows; a sheet's background is marked
  • Rows scrolled under a pinned bottom bar are marked 'behind?'
  • Map: say when the tree is empty; no masked value printed as live; no glyph aliases
  • A search field with nothing under it says the list may still be loading
  • A screen seen but never learned from is not 'known'; wrong-layout typing is said
  • App controls under the keyboard are marked, not filed as keys
  • Docs: the new map lines and selector rules; DEFERRED 199 for the two field runs
  • Plugin ships a Sonnet driver agent limited to simframe's tools
  • Code and tests carry no field-app details: neutral names in comments, fixtures and examples
  • Exact spelling breaks a tie only for three characters or more
  • A type step means a field; scrollTo says when a label is not on the screen
  • Several words are a name, not a synonym; read-back ignores the keyboard
  • A daemon that outlived its device's reboot is restarted
  • A radio or checkbox row that ignores its centre is selected at its edge, and checked
  • scrollTo does not arrive on a weak match; a short word in a long row is not a match
  • Committing a form forgets what was typed into it
  • Landing on another stored version of the expected screen is not a wrong turn
  • Benchmarks: who drives (models and tools compared); DEFERRED 200
  • Docs lead with the measured token saving: the same app session, a fraction of the tokens
  • Docs: a person did both jobs in 1.5 minutes, measured; agents were 9-10x slower
  • A baseline reset waits for the relaunched app before backing out
  • Docs: the driver agent exists only with the plugin install
  • Driver: move like a person who knows apps

Full history: v0.22.0...v0.23.0

v0.22.0

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 05 Oct 15:08

simframe 0.22.0 — on npm as simframe@0.22.0 and in the official MCP Registry as io.github.lvlrSajjad/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

Changes

  • Drop the 60 fps capture target; name the callback that actually triggers frames
  • Fixes from the 0.21.0 peer test: a read-only crawl wrote to real data
  • A tap that only changed text reads as landed; every label selector is parsed, so "bell (icon)" taps the bell
  • A launch step waits until the app can be operated, up to the 30 s launch ceiling
  • Goal mode: simframe goal / sim_goal drives to a milestone locally
  • Goal mode backs out toward a target the graph knows, home tab included, before it searches
  • Head-to-head benchmark: tokens and model calls per verified flow
  • CI tour: dismiss Safari's first-run tip before waiting for Address

Full history: v0.21.0...v0.22.0

v0.21.0

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 05 Oct 15:08

simframe 0.21.0 — on npm as simframe@0.21.0 and in the official MCP Registry as io.github.lvlrSajjad/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

Changes

  • A password typed into a field named "Password" was stored in the graph
  • A one-off scrub for graph files written before typed text was kept off them
  • No username reaches disk either: sign-in names, email addresses, and what a sign-in screen showed
  • A fingerprint-rule change no longer erases what simframe learned, and what it cannot keep is reported
  • simframe map: the cartographer crawls an app read-only and fills the graph on purpose
  • The cartographer no longer restarts an app it cannot bring back, and refuses taps that change state in place
  • Cartographer fixes from its first live runs: iOS back buttons, routes by reading, drifted edges, static text
  • A crawl waits for an app to leave its splash, and re-checks the screen before each tap
  • Arrival after a launch is judged by control type, the start screen is never relaunched from, and leaving the app takes three reads
  • The cartographer stops re-walking a screen that changed in place, and treats a row that returns to the previous screen as a picked option
  • A crawl starts from the app's start screen when a restart is safe
  • A crawl waits through a screen not yet drawn, and a crawl that maps nothing is FAILED
  • A crawl starts where the app is again: a warm relaunch of a field app takes 9-15 s, past the 10 s cap
  • A reading whose doors are mostly an existing screen's doors is that screen
  • Controls that write when tapped are barred outright, and a form's rows are not touched in a read-only crawl
  • An unlabeled back chevron is a way back, and a crawl that stopped early exits non-zero
  • While a dialog is up nothing behind it is a door, and the crawl backs out through the dialog
  • A crawl that starts under a dialog dismisses it, and a crawl that records no transition is FAILED
  • An unlabeled button is no longer a way back or a dialog, and React Native dialogs are recognised
  • The crawl learns this app's tap timeout, skips text only OCR sees mid-screen, and opens known controls first
  • Screens are compared by their doors with the numbers taken out
  • A crawl goes home through the home tab before it considers a restart
  • simframe map --trace, an unlabeled top-left chevron is a way back, and a loading label is never a door
  • A top-left button is a way back whatever it says or where the priors put it
  • Name unlabeled controls by their identifier in the cartographer, and file the icon-naming research
  • Icon-only controls are named from the app's own icon font
  • Field-app crawl 14: 34 screens; a developer error overlay is reported as an app error and never tapped
  • An app launch may wait up to 30 s, the owner's exception to the 10 s cap
  • Icon glyphs verified live on the testbed's new Icons tab; trash joins the destructive words
  • Keep the company out of shipped source, and stop the private-identifier check from flagging test variables

Full history: v0.20.1...v0.21.0

v0.20.1

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 05 Oct 15:08

simframe 0.20.1 — on npm as simframe@0.20.1 and in the official MCP Registry as io.github.lvlrSajjad/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

Changes

  • CI went red on unchanged code because example.com started animating
  • The release waited 10 minutes for npm's review, which took 20

Full history: v0.20.0...v0.20.1

v0.20.0

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 05 Oct 15:08

simframe 0.20.0 — on npm as simframe@0.20.0 and in the official MCP Registry as io.github.lvlrSajjad/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

Changes

  • DEFERRED 193: a cold-daemon tap missed on the reporter's device, then the device went away
  • DEFERRED 193: every simframe input fails on the reporter's device, and the other tool's does not
  • On Xcode 27 every tap said ok and none landed: input now goes through dtuhidd

Full history: v0.19.1...v0.20.0

v0.19.1

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 05 Oct 15:08

simframe 0.19.1 — on npm as simframe@0.19.1 and in the official MCP Registry as io.github.lvlrSajjad/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

Changes

  • The roadmap said the stale-screen fixes were unreleased, and 0.19.0 releases them
  • The bundle script leaves one bundle behind, because the stale one got published
  • The Smithery listing gets its description, links and icon from a script, not a form
  • A ref refused itself one second after it was numbered, on the same screen
  • simframe installs as a Claude Code plugin, server and skill in one step
  • A screen that changed in one frame read as moving for four seconds
  • A tap that moved nothing printed ok, and a still screen printed STILL MOVING
  • scrollTo said both ways after trying one, twice
  • The roadmap names what 0.19.1 fixes and what it leaves open

Full history: v0.19.0...v0.19.1

v0.19.0

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 25 Sep 13:06

simframe 0.19.0 — on npm as simframe@0.19.0, in the official MCP Registry as io.github.lvlrSajjad/simframe, and on Smithery as lvlr-xaus/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

The screen you are told about is the screen that is there

  • A settled read could describe the screen just left: after an action, the content region briefly held only chrome, so an empty list and a zero-result list were indistinguishable and an agent reported "this filter returns zero results" and meant it (DEFERRED 191). The read now waits for the content to arrive, not only for the pixels to stop.
  • A wrong-turn verdict (unexpected-screen) halted a batch on a single read taken of a screen still arriving, and passed on retry. It is now confirmed by a second settle-and-read, the way confirmNoChange already was; a second read that disagrees replaces the verdict and keeps both answers (174).
  • Memory may confirm, never deny: a remembered "not on this screen" answered in 25 ms was being taken as a failure for the step after a tap, reproducibly 6 of 6 on the bench. A denial from memory now falls through to a live read (173).

Fixes

  • scrollTo threw points is not defined after it had already found the target, and the symptom looked like three different bugs (190). By Pedro Morais: SimulatorKit.framework is found after Xcode moved it into SharedFrameworks (#1).
  • diagnose no longer calls a device healthy while its accessibility tree is dead, and revive now ends by asking diagnose rather than by checking that frames flow (183).

Around the code

  • The README installs in ten seconds: config blocks for Claude Code, Claude Desktop and Cursor (one-click), a GIF of one simframe do call driving Settings with every step verified, and the essay moved whole to docs/GUIDE.md.
  • scripts/smithery-bundle.mjs builds the Smithery bundle per release; glama.json names the maintainer.
  • Phase 19 (the web as a third target) is deferred by its own first measurement: batching is the larger term, and three runs converged on actuation recovery rather than a transition graph. The decision and the numbers are in docs/DECISIONS.md.

Full history: v0.18.0...v0.19.0

v0.18.0

Choose a tag to compare

@lvlrSajjad lvlrSajjad released this 25 Sep 12:32

simframe 0.18.0 — on npm as simframe@0.18.0 and in the official MCP Registry as io.github.lvlrSajjad/simframe.

claude mcp add --scope user simframe -- npx -y simframe mcp

What changed since 0.17.0

  • simframe diagnose — says what a device is doing right now and which failure it is (capture-down, nothing-readable, stale-frame, not-presenting, tree-silent, ocr-silent, healthy), which doctor cannot. The stale-frame threshold is measured from element fusion on real screens rather than chosen.
  • The launch is a fixed cost, now measured and documented: per-step wall clock is (model round trip + launch + ~1.7 s × n) / n, which is why short routes look worse than long ones.
  • DEFERRED 173 is identified as a transient SpringBoard crash and no longer counted against accuracy; the delay experiment that seemed to explain it was found to have measured a dying device, and the evidence moved with it.
  • diagnose no longer throws on the one condition it exists to name.

Full history: v0.17.0...v0.18.0