Skip to main content
The reticle CLI installs Reticle into a project and proves the install works (init), runs and diagnoses the daemon your app connects to (status, doctor, stop, restart), and gates a build on verification in CI (verify, affected, gate). This page is the index; each command has its own page with real captured output and measured exit codes. The CLI is mostly for you, not your agent. Your agent talks MCP; you use these to set things up, work out why nothing connected, and wire verification into CI.
If you used the installer, run reticle <command>: it put that bin on your PATH. Otherwise use npx @reticlehq/server <command>. Do not put npx before the bare reticle bin name: the npm package with that name belongs to an unrelated author.
Every output block on this page was captured by running the command. Where an exit code is quoted, it was measured, not assumed. The CLI emits each structured line as one line of JSON; the blocks below are pretty-printed so you can read them, and long lists are trimmed where the label says so.

Every command

reticle --help prints the short list, grouped the way you meet the commands. reticle help all prints every command, and reticle <command> --help prints one command’s detail.

Get started

Check your app

Reticle on this machine

Account

More commands (reticle help all)

Renamed and removed

The old names below still work for one release and print one line naming the new one. These names were removed. Each prints what to use instead and exits 1.

Setup and diagnosis

reticle connect

From an app directory, one command wires an unwired app, proves a browser session, signs in through browser approval if needed, links the chosen cloud project, and syncs existing local history. A saved sign-in is reused only after the intended cloud host accepts it. Run reticle init instead for local-only verification.
For a self-hosted cloud, add --url <cloud origin>. If the app was already wired, connect keeps its local setup and refreshes the cloud link. A fresh app has no run to send until you verify a flow with your agent.

reticle init

Wires Reticle into the project in the current directory, then boots the app and proves a session connected. It exits non-zero if nothing connected, and prints what is left to do. It does not drive: proving a flow is the FIRST RUN, which your agent drives with reticle_act_and_wait and an until on its last step, or, with a linked project, reticle verify <url> --explore --persona "<who does what>".
--env and --app are the answers the command cannot work out for itself: what the app needs to reach a usable state, and which app in a monorepo. Which journey proves what you care about is asked on the first run, as --persona. --files-only is what init did before it learned to boot the app: it still registers the MCP server and pre-approves Reticle’s tools, so it doubles as the upgrade path for an existing install.

Full walkthrough with real output

What it writes, and how to read its five status marks.

reticle doctor

The first thing to run when something is wrong. One command, the whole setup.
Exits 0. That parenthetical about the bridge port is doing a lot of work. Mixing it up with the dev-server port is the most common setup failure there is.

reticle status

Whether the daemon is up, which apps have connected, who is signed in, and whether this repo is linked to a cloud project.
Add --json for the same facts as one machine-readable event line. See reticle status for the fields. Exits 0. A session listed means the SDK reached the page. Setup is finished when the first run returns a verdict.

reticle telemetry [status|enable|disable]

Exactly what is collected

The complete list, and how to turn it off.

Running the app

A bare reticle with no arguments is not help. In a project that init wired, it is reticle serve. In a folder that Reticle has not wired, it gives a first verdict with no agent and no init. It finds the folder’s web app (it starts the dev script when the app does not run), or the one dev server that runs on this computer. It opens the page in a Reticle browser and checks four things: the page loads, no console error, no failed request, and each same-origin link opens (8 at most). It prints verified: yes or verified: no with each fault, and exits 0 only for yes. A page that goes to a sign-in page is verified up to there. It stops the dev server it started.
When the Reticle SDK installed in the project is a different major version from the CLI you ran, the CLI hands the same command to npx @reticlehq/server@<that version>, so an unpinned npx @reticlehq/server never pairs a daemon with an SDK it cannot talk to. init, update, update --rollback, setup install, version and help always run as typed, and so does a command whose version you pinned yourself (npx @reticlehq/server@<version> …). Set RETICLE_NO_VERSION_MATCH=1 to turn it off. Because --help runs as typed too, it describes the CLI you ran. When the command it describes would run at the project’s version instead, the help opens with a line naming that version.
reticle verify works whether or not a daemon is running. With none, it starts its own browser on the bridge port. With one, it replays the saved flows (or answers --expect) through that daemon. Only --headed and --storage-state need their own browser, so with a daemon running those two refuse and say so. Do not stop the daemon to get around it: that cuts your agent’s MCP link. Point verify at a free port with --port N instead.

Verification

reticle verify <url>

One-shot: drive the URL, replay the saved flows, exit 0 on pass. This is the command for CI when you do not want a model in the loop.
Options:
  • --headed, --timeout N, --port N.
  • --storage-state <file>: verify flows behind a login without scripting the login every time.
  • --session-id <id>: use a tab that is already connected.
  • --select <label>: verify only flows carrying this label. Repeatable.
  • --expect '<json predicate>' or --expect-file <path>: one verdict, no saved flows needed. Asks the running daemon; with none, it refuses. Waits up to --timeout ms (default 4000) for the predicate to come true. Exits 0 only on verified: "yes".
  • --explore with --persona "<who does what>": no saved flows yet? The Harness drives the app and records them. Needs a linked project (reticle connect).
  • --results-json <file>: also write one verdict per journey as JSON, for CI.
  • --confirm-dangerous: let this run press what the replay guard holds as destructive.

reticle gate --list

Which saved flows must re-verify for a set of changed files. It checks nothing.
Both lists are trimmed here; the real run named 47 flows.
unknownProvenance lists flows Reticle could not map to source files, so it includes them to be safe. A flow recorded before provenance tracking existed has no file list, and Reticle would rather re-run it than skip it and miss a regression. A large unknownProvenance means your flows predate the feature. Re-record the ones you care about to get precise selection.

reticle gate

The CI gate. Exits non-zero unless passing artifacts cover the affected flows.
Measured exit code: 1, with the flow lists trimmed above. That run genuinely failed, with 0 of 47 flows covered, which is what a gate is supposed to do when you have not verified anything yet. quarantined flows are excluded from the pass/fail decision. Quarantine is for a flow that is known flaky and being fixed; it is not a place to hide failures, because the list is printed on every run.

Maintenance

rollback exists because an auto-updating dev tool that cannot go back is a dev tool that can ruin your afternoon. It restores the previous version and restarts in one step.

Feedback

The --agent form matters more than it looks: the setup that failed halfway is exactly the setup worth hearing about, and in that state the MCP tools do not exist yet.

How feedback is handled

What each kind means, and what happens when a report cannot be delivered.
Last modified on November 11, 2026