Skip to main content
reticle_query answers “where is the thing I mean?” without dumping the whole page into your context window. It queries the way a testing library does. By role, label, text, testid. So your agent binds to meaning rather than to DOM structure that a refactor will move.

Example

Real response from a running app:
Seven buttons, each with a ref to act on and a source file to open, for 235 tokens.

Arguments

Every argument also has a predicate spelling, so { "role": "button" } works as shorthand for { "by": "role", "value": "button" }.

Use count_only when you only need a number

“Are there still three rows?” does not require three row descriptors:

Reading the response

ref is the handle for every other tool: act, inspect, state. It stays valid until the element leaves the DOM, so you do not need to re-snapshot between actions on the same element. source appears when @reticlehq/react is installed. Note that all five sidebar buttons above report Sidebar.tsx:41. That is the line where the component renders them in a loop, which is exactly the line you want to edit. truncated: true with total: 7 means limit cut the list, not that Reticle ran out of room. states distinguishes present from visible from enabled. An element can be all three and still be covered by a modal. reticle_inspect reports occluded for that.
Query by testid when you can. Role and text queries survive refactors well; testids survive redesigns, translations, and the day someone rewrites your button labels for the marketing team.
Last modified on August 14, 2026