@reticlehq/server 2.7.0 → 2.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -5
- package/SKILL.md +130 -778
- package/dist/bridge/bridge.d.ts +23 -0
- package/dist/bridge/bridge.js +80 -2
- package/dist/bridge/bridge.test-harness.d.ts +5 -0
- package/dist/bridge/bridge.test-harness.js +6 -4
- package/dist/capsule/causal-summary.d.ts +36 -1
- package/dist/capsule/causal-summary.js +33 -7
- package/dist/capsule/divergence.js +7 -1
- package/dist/cli/chromium-hint.d.ts +33 -5
- package/dist/cli/chromium-hint.js +82 -12
- package/dist/cli/cli-doctor.js +65 -34
- package/dist/cli/cli-flow-commands.js +8 -8
- package/dist/cli/cli-kill.d.ts +58 -0
- package/dist/cli/cli-kill.js +162 -0
- package/dist/cli/cli-parse.d.ts +16 -1
- package/dist/cli/cli-parse.js +32 -9
- package/dist/cli/cli-port.d.ts +32 -0
- package/dist/cli/cli-port.js +82 -35
- package/dist/cli/cli-verify.d.ts +21 -0
- package/dist/cli/cli-verify.js +47 -3
- package/dist/cli/config-discovery.d.ts +35 -0
- package/dist/cli/config-discovery.js +163 -0
- package/dist/cli/doctor-daemon-line.js +4 -1
- package/dist/cli/doctor-project-line.d.ts +37 -0
- package/dist/cli/doctor-project-line.js +35 -0
- package/dist/cli/doctor-rows.d.ts +51 -0
- package/dist/cli/doctor-rows.js +54 -0
- package/dist/cli/doctor-sessions-line.d.ts +12 -0
- package/dist/cli/doctor-sessions-line.js +69 -0
- package/dist/cli/drive-attach.d.ts +99 -0
- package/dist/cli/drive-attach.js +203 -0
- package/dist/cli/drive-command.d.ts +13 -0
- package/dist/cli/drive-command.js +103 -0
- package/dist/cli/open-note.d.ts +20 -0
- package/dist/cli/open-note.js +37 -0
- package/dist/cli/port-holder.d.ts +10 -0
- package/dist/cli/port-holder.js +26 -2
- package/dist/cli/status-next-action.d.ts +37 -0
- package/dist/cli/status-next-action.js +61 -0
- package/dist/cli.js +119 -39
- package/dist/crawl/crawl-tools.js +12 -2
- package/dist/crawl/crawl.d.ts +13 -0
- package/dist/crawl/crawl.js +50 -2
- package/dist/events/contradictions.d.ts +46 -0
- package/dist/events/contradictions.js +35 -22
- package/dist/events/declared.d.ts +45 -0
- package/dist/events/declared.js +73 -0
- package/dist/events/echo-mismatch.d.ts +8 -2
- package/dist/events/echo-mismatch.js +33 -5
- package/dist/events/event-filters.d.ts +1 -1
- package/dist/events/event-filters.js +7 -4
- package/dist/events/predicate-eval.d.ts +17 -72
- package/dist/events/predicate-eval.js +117 -236
- package/dist/events/predicate-parse.js +31 -3
- package/dist/events/predicate-route.d.ts +32 -0
- package/dist/events/predicate-route.js +102 -0
- package/dist/events/predicate-schema.d.ts +99 -0
- package/dist/events/predicate-schema.js +309 -0
- package/dist/events/predicate.d.ts +8 -0
- package/dist/events/predicate.js +296 -22
- package/dist/flows/annotate-tools.js +3 -0
- package/dist/flows/annotate.js +18 -4
- package/dist/flows/coverage.d.ts +38 -5
- package/dist/flows/coverage.js +30 -4
- package/dist/flows/decision.d.ts +15 -0
- package/dist/flows/decision.js +1 -1
- package/dist/flows/flow-classify.js +1 -1
- package/dist/flows/flow-replay-run.js +8 -1
- package/dist/flows/flow-tools.js +21 -5
- package/dist/flows/heal-run.js +1 -1
- package/dist/flows/replay.js +3 -0
- package/dist/honesty/accepted-write.d.ts +3 -0
- package/dist/honesty/accepted-write.js +8 -3
- package/dist/honesty/already-true.js +15 -0
- package/dist/honesty/blind-spots.js +10 -2
- package/dist/honesty/honesty.d.ts +11 -0
- package/dist/honesty/honesty.js +1 -0
- package/dist/honesty/uncaptured-bodies.d.ts +4 -2
- package/dist/honesty/uncaptured-bodies.js +9 -2
- package/dist/honesty/unread-outcome.d.ts +8 -0
- package/dist/honesty/unread-outcome.js +36 -9
- package/dist/honesty/unsettled.d.ts +49 -0
- package/dist/honesty/unsettled.js +82 -0
- package/dist/honesty/verified.d.ts +36 -3
- package/dist/honesty/verified.js +54 -11
- package/dist/http-server.d.ts +19 -0
- package/dist/http-server.js +202 -4
- package/dist/impact/impact-recorder.d.ts +23 -0
- package/dist/impact/impact-recorder.js +76 -0
- package/dist/impact/impact-store.d.ts +47 -0
- package/dist/impact/impact-store.js +171 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +47 -10
- package/dist/init/agent-rules.d.ts +36 -0
- package/dist/init/agent-rules.js +132 -22
- package/dist/init/astro-patch.d.ts +2 -1
- package/dist/init/astro-patch.js +38 -6
- package/dist/init/capabilities.d.ts +22 -0
- package/dist/init/capabilities.js +76 -0
- package/dist/init/confirm.d.ts +114 -0
- package/dist/init/confirm.js +165 -0
- package/dist/init/connect-steps.d.ts +2 -0
- package/dist/init/connect-steps.js +50 -0
- package/dist/init/cra.js +3 -2
- package/dist/init/csp-check.d.ts +38 -0
- package/dist/init/csp-check.js +92 -0
- package/dist/init/csp-doctor.d.ts +25 -0
- package/dist/init/csp-doctor.js +49 -0
- package/dist/init/cursor.js +6 -9
- package/dist/init/detect.d.ts +8 -0
- package/dist/init/detect.js +33 -3
- package/dist/init/mcp-clients.d.ts +1 -0
- package/dist/init/mcp-clients.js +51 -7
- package/dist/init/mcp.d.ts +15 -0
- package/dist/init/mcp.js +19 -0
- package/dist/init/non-js-project.js +29 -5
- package/dist/init/plan-framework.d.ts +10 -0
- package/dist/init/plan-framework.js +78 -16
- package/dist/init/plan.d.ts +47 -6
- package/dist/init/plan.js +228 -69
- package/dist/init/run.d.ts +24 -2
- package/dist/init/run.js +157 -45
- package/dist/init/slash-command.d.ts +1 -1
- package/dist/init/slash-command.js +54 -6
- package/dist/init/snippets.d.ts +45 -5
- package/dist/init/snippets.js +194 -42
- package/dist/init/vite-config.js +53 -5
- package/dist/input/network-mock-tools.d.ts +19 -0
- package/dist/input/network-mock-tools.js +37 -5
- package/dist/input/scroll-find.d.ts +6 -0
- package/dist/input/scroll-find.js +17 -2
- package/dist/input/scroll-tools.js +4 -0
- package/dist/journal/attach-journal.d.ts +9 -1
- package/dist/journal/attach-journal.js +13 -2
- package/dist/journal/journal-query.d.ts +13 -0
- package/dist/journal/journal-query.js +28 -3
- package/dist/journal/workspace-gitignore.d.ts +10 -0
- package/dist/journal/workspace-gitignore.js +59 -0
- package/dist/license/license.js +1 -1
- package/dist/mcp/mcp-proxy.d.ts +35 -30
- package/dist/mcp/mcp-proxy.js +306 -104
- package/dist/mcp/mcp.d.ts +10 -1
- package/dist/mcp/mcp.js +70 -34
- package/dist/mcp/proxy-handshake.d.ts +82 -1
- package/dist/mcp/proxy-handshake.js +109 -2
- package/dist/mcp/proxy-lifecycle.d.ts +11 -2
- package/dist/mcp/proxy-lifecycle.js +12 -3
- package/dist/mcp/proxy-log.d.ts +63 -0
- package/dist/mcp/proxy-log.js +132 -0
- package/dist/mcp/server-instructions.d.ts +17 -0
- package/dist/mcp/server-instructions.js +56 -0
- package/dist/mcp/shared-params.d.ts +27 -0
- package/dist/mcp/shared-params.js +36 -0
- package/dist/pool/browser-pool.d.ts +22 -2
- package/dist/pool/browser-pool.js +44 -4
- package/dist/project/learned-routes.d.ts +24 -0
- package/dist/project/learned-routes.js +63 -0
- package/dist/project/project-store.d.ts +6 -0
- package/dist/project/project-store.js +25 -1
- package/dist/project/reticle-dir.d.ts +2 -0
- package/dist/project/reticle-dir.js +1 -0
- package/dist/session/connection-memory.d.ts +59 -0
- package/dist/session/connection-memory.js +108 -0
- package/dist/session/dev-command.d.ts +26 -0
- package/dist/session/dev-command.js +89 -0
- package/dist/session/dev-server-probe.d.ts +68 -0
- package/dist/session/dev-server-probe.js +102 -7
- package/dist/session/last-act.d.ts +26 -0
- package/dist/session/last-act.js +35 -1
- package/dist/session/live-control-tools.js +42 -5
- package/dist/session/no-session-diagnosis.d.ts +67 -2
- package/dist/session/no-session-diagnosis.js +236 -27
- package/dist/session/no-session-next-action.d.ts +46 -0
- package/dist/session/no-session-next-action.js +85 -0
- package/dist/session/no-session-watch.d.ts +40 -1
- package/dist/session/no-session-watch.js +174 -8
- package/dist/session/pending-commands.d.ts +12 -0
- package/dist/session/pending-commands.js +13 -1
- package/dist/session/ref-provenance.d.ts +54 -0
- package/dist/session/ref-provenance.js +61 -0
- package/dist/session/session-lease.js +1 -1
- package/dist/session/session-manager.d.ts +4 -0
- package/dist/session/session-manager.js +35 -5
- package/dist/session/session.d.ts +10 -1
- package/dist/session/session.js +146 -5
- package/dist/telemetry/app-instrumented.d.ts +8 -0
- package/dist/telemetry/app-instrumented.js +10 -0
- package/dist/telemetry/automation-hint.d.ts +17 -0
- package/dist/telemetry/automation-hint.js +71 -0
- package/dist/telemetry/bug-found.d.ts +15 -17
- package/dist/telemetry/bug-found.js +52 -21
- package/dist/telemetry/cli-telemetry.js +7 -1
- package/dist/telemetry/daemon-telemetry.js +24 -0
- package/dist/telemetry/feedback.js +1 -1
- package/dist/telemetry/init-telemetry.js +9 -1
- package/dist/telemetry/install-source.d.ts +56 -0
- package/dist/telemetry/install-source.js +74 -0
- package/dist/telemetry/instrumentation-stall.d.ts +50 -0
- package/dist/telemetry/instrumentation-stall.js +90 -0
- package/dist/telemetry/run-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +8 -0
- package/dist/telemetry/session-metrics.js +15 -0
- package/dist/telemetry/telemetry.d.ts +7 -1
- package/dist/telemetry/telemetry.js +26 -2
- package/dist/telemetry/tool-refused.d.ts +19 -0
- package/dist/telemetry/tool-refused.js +55 -0
- package/dist/telemetry/verification-of.js +46 -7
- package/dist/temp-dir.d.ts +27 -0
- package/dist/temp-dir.js +46 -0
- package/dist/tools/act-tools.js +209 -28
- package/dist/tools/assert-grade.d.ts +1 -1
- package/dist/tools/assert-grade.js +27 -5
- package/dist/tools/assert-verdict.js +49 -7
- package/dist/tools/browser-tools.js +10 -0
- package/dist/tools/contract-tools.js +4 -0
- package/dist/tools/dynamic-tools.js +16 -7
- package/dist/tools/error-recovery.d.ts +10 -0
- package/dist/tools/error-recovery.js +73 -9
- package/dist/tools/feedback-invite.js +1 -1
- package/dist/tools/invoke-tool.js +159 -26
- package/dist/tools/lease-hint.d.ts +30 -8
- package/dist/tools/lease-hint.js +65 -14
- package/dist/tools/lease-tools.d.ts +40 -1
- package/dist/tools/lease-tools.js +181 -83
- package/dist/tools/navigate-result.js +1 -1
- package/dist/tools/observe-tools.js +10 -4
- package/dist/tools/observed-nothing.js +1 -1
- package/dist/tools/react-grace.d.ts +52 -0
- package/dist/tools/react-grace.js +90 -0
- package/dist/tools/read-tools.js +67 -5
- package/dist/tools/resolve-target.d.ts +33 -0
- package/dist/tools/resolve-target.js +53 -0
- package/dist/tools/settle-in-flight.d.ts +94 -0
- package/dist/tools/settle-in-flight.js +146 -0
- package/dist/tools/snapshot-delta.d.ts +10 -0
- package/dist/tools/snapshot-delta.js +194 -9
- package/dist/tools/tool-kit.d.ts +8 -0
- package/dist/tools/tool-surface.d.ts +60 -0
- package/dist/tools/tool-surface.js +86 -1
- package/dist/tools/tools.js +61 -8
- package/dist/tools/unadvertised-help.js +9 -6
- package/docs/README.md +55 -11
- package/docs/actions.mdx +120 -0
- package/docs/agent-cheatsheet.md +95 -29
- package/docs/architecture.md +52 -35
- package/docs/benchmarks.md +127 -75
- package/docs/best-practices.mdx +216 -0
- package/docs/capabilities.mdx +534 -0
- package/docs/cli/affected.mdx +53 -0
- package/docs/cli/capsules.mdx +70 -0
- package/docs/cli/cloud.mdx +153 -0
- package/docs/cli/doctor.mdx +109 -0
- package/docs/cli/drive.mdx +74 -0
- package/docs/cli/feedback.mdx +67 -0
- package/docs/cli/gate.mdx +64 -0
- package/docs/cli/help.mdx +94 -0
- package/docs/cli/hunt.mdx +73 -0
- package/docs/cli/identify.mdx +76 -0
- package/docs/cli/init.mdx +121 -0
- package/docs/cli/kill.mdx +91 -0
- package/docs/cli/license.mdx +48 -0
- package/docs/cli/mcp.mdx +61 -0
- package/docs/cli/open.mdx +74 -0
- package/docs/cli/restart.mdx +60 -0
- package/docs/cli/rollback.mdx +35 -0
- package/docs/cli/serve.mdx +69 -0
- package/docs/cli/status.mdx +88 -0
- package/docs/cli/stop.mdx +64 -0
- package/docs/cli/telemetry.mdx +57 -0
- package/docs/cli/update.mdx +52 -0
- package/docs/cli/verify.mdx +76 -0
- package/docs/cli/version.mdx +39 -0
- package/docs/cli/watch.mdx +62 -0
- package/docs/cli.mdx +241 -0
- package/docs/debugging.md +16 -10
- package/docs/deploy-checks.md +45 -12
- package/docs/desktop.mdx +384 -0
- package/docs/docs.json +364 -0
- package/docs/enterprise.md +22 -16
- package/docs/faq.mdx +102 -0
- package/docs/fixtures.md +13 -7
- package/docs/flows.md +29 -23
- package/docs/for-agents.md +71 -0
- package/docs/frameworks.mdx +238 -0
- package/docs/gate-plan.md +48 -42
- package/docs/gates.md +28 -22
- package/docs/getting-started.md +129 -77
- package/docs/human-control.md +24 -18
- package/docs/index.mdx +143 -0
- package/docs/install-agentic.mdx +224 -0
- package/docs/install-manual.mdx +196 -0
- package/docs/instrumentation.mdx +238 -0
- package/docs/integration-patterns.md +41 -35
- package/docs/local-registry.md +19 -13
- package/docs/multi-agent-testing.md +19 -13
- package/docs/packages/babel-plugin.mdx +79 -0
- package/docs/packages/browser.mdx +111 -0
- package/docs/packages/core.mdx +116 -0
- package/docs/packages/electron.mdx +85 -0
- package/docs/packages/eslint-plugin.mdx +86 -0
- package/docs/packages/next.mdx +89 -0
- package/docs/packages/react.mdx +91 -0
- package/docs/packages/server.mdx +98 -0
- package/docs/packages/tauri.mdx +63 -0
- package/docs/packages/test.mdx +119 -0
- package/docs/packages/vite-plugin.mdx +94 -0
- package/docs/packages.mdx +218 -0
- package/docs/platform-integration.md +35 -26
- package/docs/predicates.mdx +248 -0
- package/docs/quickstart.mdx +257 -0
- package/docs/recipes.mdx +282 -0
- package/docs/skill-file.mdx +107 -0
- package/docs/state-management.mdx +199 -0
- package/docs/style.css +14 -0
- package/docs/system-map.md +50 -33
- package/docs/telemetry-contract.md +106 -52
- package/docs/telemetry-events.mdx +475 -0
- package/docs/telemetry.md +63 -55
- package/docs/testing.md +44 -6
- package/docs/token-efficiency.md +37 -27
- package/docs/tools-act-and-wait.mdx +173 -0
- package/docs/tools-act-sequence.mdx +137 -0
- package/docs/tools-act.mdx +95 -0
- package/docs/tools-assert.mdx +129 -0
- package/docs/tools-console.mdx +63 -0
- package/docs/tools-inspect.mdx +88 -0
- package/docs/tools-navigate.mdx +99 -0
- package/docs/tools-network.mdx +119 -0
- package/docs/tools-observe.mdx +145 -0
- package/docs/tools-overview.mdx +160 -0
- package/docs/tools-query.mdx +126 -0
- package/docs/tools-session-and-feedback.mdx +112 -0
- package/docs/tools-sessions.mdx +94 -0
- package/docs/tools-snapshot.mdx +129 -0
- package/docs/tools-state.mdx +104 -0
- package/docs/tools-tools-and-run.mdx +156 -0
- package/docs/tools-wait-for.mdx +85 -0
- package/docs/troubleshooting.mdx +263 -0
- package/docs/usage.md +209 -165
- package/docs/vs-chrome-devtools-mcp.mdx +123 -0
- package/docs/vs-playwright-mcp.mdx +125 -0
- package/docs/vs-screenshots.mdx +137 -0
- package/docs/what-is-reticle.mdx +63 -0
- package/docs/why-reticle.mdx +109 -0
- package/package.json +5 -5
- package/docs/desktop-apps.md +0 -256
- package/docs/matrix/2.5.0/claude-code-machine.json +0 -19
- package/docs/matrix/2.5.0/codex-machine.json +0 -20
- package/docs/matrix/2.5.0/cursor-machine.json +0 -22
- package/docs/matrix/2.5.0/gemini-machine.json +0 -22
- package/docs/matrix/2.5.0/opencode-machine.json +0 -22
- package/docs/matrix/2.5.0/vscode-machine.json +0 -22
- package/docs/matrix/2.5.0/windsurf-machine.json +0 -22
- package/docs/matrix/MATRIX.md +0 -26
- package/docs/matrix/README.md +0 -59
- package/docs/mint.json +0 -61
package/docs/human-control.md
CHANGED
|
@@ -1,39 +1,45 @@
|
|
|
1
|
-
|
|
1
|
+
---
|
|
2
|
+
title: 'Human-in-the-loop control'
|
|
3
|
+
description: 'Watch the agent’s live transcript, steer it mid-run, or end the session, all from inside the page itself.'
|
|
4
|
+
icon: hand
|
|
5
|
+
---
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
With the presenter on (`reticle.connect({ present: true })`), the floating panel in your page lets you watch the agent's live transcript and steer it: **pause** it (its next action tool refuses and returns your guidance), **send** it a correction that rides back on its next tool result, or **end** the session. You can also point at a broken element with **Flag a bug** and hand the agent the element plus its source `file:line`.
|
|
8
|
+
|
|
9
|
+
When you run with the presenter on (`reticle.connect({ present: true })`), the floating panel is a **two-way control surface**. You watch the agent's live transcript _and_ can steer it (pause it, send it a correction, or end the session) without leaving the page. There's also a clean, unmistakable "session ended" signal for both you and the agent.
|
|
4
10
|
|
|
5
11
|
## Watch the testing score climb (the live verdict tally)
|
|
6
12
|
|
|
7
|
-
The panel header shows a running **✓N ✗M** tally
|
|
13
|
+
The panel header shows a running **✓N ✗M** tally: the verdict score, live. It's hidden until the first verdict lands, then climbs as the agent verifies: every `reticle_assert`, every replayed flow step, every pass/fail outcome bumps it, and the side that just grew **pops** so you _feel_ the green (or red) arrive. The cursor flies, the log streams the journey, and the score ticks up. You see the agent working and the result landing, not just a final checkmark. It persists when the session ends, so the last thing on screen is what this run actually verified. Green that's earned, not asserted.
|
|
8
14
|
|
|
9
15
|
## The constraint that shapes the design
|
|
10
16
|
|
|
11
|
-
MCP is **pull-based**: the agent only receives data when it calls a tool. Reticle can't freeze the model mid-thought
|
|
17
|
+
MCP is **pull-based**: the agent only receives data when it calls a tool. Reticle can't freeze the model mid-thought, but it **intercepts the agent's next tool call**, which is exactly when the agent would touch the page. That makes steering reliable:
|
|
12
18
|
|
|
13
|
-
- **Nudge** (a message, no pause)
|
|
14
|
-
- **Pause
|
|
15
|
-
- **End
|
|
19
|
+
- **Nudge** (a message, no pause). Your text is queued and rides back on the agent's **next** tool result as `guidance` (delivered once). The agent reads it and adjusts.
|
|
20
|
+
- **Pause.** The agent's next `reticle_act` / `reticle_act_and_wait` / `reticle_act_sequence` **refuses to execute** and returns `{ paused: true, guidance: ["<your message>"], hint: "…" }`. The page is untouched until resume. _Read-only tools (snapshot/query/observe) still work_, so the agent can look while paused.
|
|
21
|
+
- **End.** The session is over; the panel shows "Session ended" and clears.
|
|
16
22
|
|
|
17
23
|
## From the panel (the human)
|
|
18
24
|
|
|
19
25
|
The floating panel (bottom-center, `present: true`) gives you:
|
|
20
26
|
|
|
21
|
-
- **Pause / Resume
|
|
22
|
-
- **Message box + send
|
|
23
|
-
- **End**
|
|
24
|
-
- **Minimise (▾)**
|
|
25
|
-
- **Flag a bug
|
|
27
|
+
- **Pause / Resume**: one toggle. Paused turns the panel + page border **amber** with a `PAUSED` badge.
|
|
28
|
+
- **Message box + send.** Type a correction ("check the error state first"), hit Send (or Enter). Your message shows as a `🧑 you:` bubble in the transcript **and** is delivered to the agent.
|
|
29
|
+
- **End** ends the session: panel turns **emerald**, shows `Session ended · <summary>`, then fades away.
|
|
30
|
+
- **Minimise (▾)** collapses the panel to a bar that streams only the live line; click the bar to restore.
|
|
31
|
+
- **Flag a bug**, the button in the corner. Toggle it on, click the element that looks wrong, type what's wrong (⌘/Ctrl+Enter to send, Esc to back out). Reticle pins a numbered marker, logs your flag in the panel, and hands the agent a structured mark.
|
|
26
32
|
|
|
27
|
-
## Flag a bug
|
|
33
|
+
## Flag a bug: annotate the mistake where you see it
|
|
28
34
|
|
|
29
|
-
You don't have to describe a bug in prose. **Point at it.** The flag captures the element's re-resolvable anchor _and_ the source `file:line` (when the framework stamped one), so the agent fixes the exact element and code
|
|
35
|
+
You don't have to describe a bug in prose. **Point at it.** The flag captures the element's re-resolvable anchor _and_ the source `file:line` (when the framework stamped one), so the agent fixes the exact element and code, not a guess. The loop:
|
|
30
36
|
|
|
31
37
|
1. **You** flag the element and type the problem → Reticle emits a `HUMAN_MARK`.
|
|
32
|
-
2. **The agent** drains it with `reticle_session {action:"review"}
|
|
38
|
+
2. **The agent** drains it with `reticle_session {action:"review"}`, getting note + element label + `source: { file, line }` + a ready-to-act `fix` hint. `reticle_sessions` also reports `pendingMarks` so the agent notices flags.
|
|
33
39
|
3. **The agent** opens the file, fixes it, and calls `reticle_session {action:"review"}({ resolve: "m1" })`.
|
|
34
40
|
4. **You** see **"✓ fixed: \<your note\>"** land in the panel. Flag → fix → confirmation.
|
|
35
41
|
|
|
36
|
-
See [`reticle_session {action:"review"}` in the usage guide](usage
|
|
42
|
+
See [`reticle_session {action:"review"}` in the usage guide](/usage) for the tool shape. Suppress the button with `annotate: false` if you don't want it.
|
|
37
43
|
|
|
38
44
|
## From the agent (the tools)
|
|
39
45
|
|
|
@@ -44,7 +50,7 @@ See [`reticle_session {action:"review"}` in the usage guide](usage.md#reticle_se
|
|
|
44
50
|
| `reticle_session {action:"messages"}` | `{ sessionId? }` | drain + read pending human messages (explicit poll) |
|
|
45
51
|
| `reticle_session {action:"review"}` | `{ resolve?, all?, sessionId? }` | list the bugs the human flagged; resolve one once fixed |
|
|
46
52
|
|
|
47
|
-
When paused, every action tool short-circuits with the human's guidance, so the agent learns of the pause on its very next action. The agent's expected behavior: **read the guidance, adjust the plan, then call `reticle_session {action:"resume"}`** (or wait for the human to click Resume). The agent can also end the run itself with `reticle_session {action:"end"}({ summary })` when it's done
|
|
53
|
+
When paused, every action tool short-circuits with the human's guidance, so the agent learns of the pause on its very next action. The agent's expected behavior: **read the guidance, adjust the plan, then call `reticle_session {action:"resume"}`** (or wait for the human to click Resume). The agent can also end the run itself with `reticle_session {action:"end"}({ summary })` when it's done. Either path shows the same "ended" state.
|
|
48
54
|
|
|
49
55
|
## Piggybacked guidance
|
|
50
56
|
|
|
@@ -54,7 +60,7 @@ Even without a pause, action/observe/assert results carry a `control` block when
|
|
|
54
60
|
{ since, dispatched, settled, result, control: { state: "active", guidance: ["looks good, keep going"] } }
|
|
55
61
|
```
|
|
56
62
|
|
|
57
|
-
`guidance` is drained (delivered once), so a hint never repeats. When the session is clean and the inbox empty, no `control` field is added
|
|
63
|
+
`guidance` is drained (delivered once), so a hint never repeats. When the session is clean and the inbox empty, no `control` field is added: zero overhead on the happy path.
|
|
58
64
|
|
|
59
65
|
## Tell your agent to honor it
|
|
60
66
|
|
package/docs/index.mdx
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Verification for AI coding agents
|
|
3
|
+
description: Reticle is the proof layer for AI coding agents. It verifies a running web app from the inside and returns a verdict with evidence, not a screenshot.
|
|
4
|
+
mode: wide
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Your agent says it works. Reticle checks.
|
|
8
|
+
|
|
9
|
+
AI-written code has a specific failure mode: it looks right and silently doesn't work. The POST returns 200 and nothing persists. The button is wired to a handler that never fires. One click sends two requests. A screenshot shows all of this as a perfectly nice page.
|
|
10
|
+
|
|
11
|
+
Reticle reads the program from **inside** your running app. Network, state, console, routing, framework internals.
|
|
12
|
+
|
|
13
|
+
It answers the only question that matters: did the change actually work? On React it also tells your agent which file to open.
|
|
14
|
+
|
|
15
|
+
## Install it: paste this into your coding agent
|
|
16
|
+
|
|
17
|
+
You do not install Reticle by hand. Copy the block below into Claude Code, Cursor, Copilot, Codex, Windsurf, OpenCode, or any MCP agent, and let the agent wire its own workspace. It ends with the only definition of "installed" that counts: one real flow driven, one real verdict returned.
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
Reticle is the proof layer for AI coding agents. It runs a dev-only SDK inside my
|
|
21
|
+
running web app, so instead of guessing whether your change worked, you can drive
|
|
22
|
+
the real app and read what actually happened: the network calls, the store, the
|
|
23
|
+
console, the routes, the DOM. You get back pass, fail, or "couldn't tell", with
|
|
24
|
+
the file:line to fix. No screenshots, no vision model, no test syntax.
|
|
25
|
+
|
|
26
|
+
Use it because you cannot otherwise tell whether your own code works. Reading the
|
|
27
|
+
diff proves nothing, and unit tests do not run the app. Reticle is how you check
|
|
28
|
+
your work before telling me it is done, and how you stop reporting "fixed" over a
|
|
29
|
+
silent 500.
|
|
30
|
+
|
|
31
|
+
Install it now:
|
|
32
|
+
|
|
33
|
+
RETICLE_INSTALL_SOURCE=docs_site npx @reticlehq/server@latest init
|
|
34
|
+
|
|
35
|
+
Then follow https://docs.reticle.sh/install-agentic.md and, if anything needs a
|
|
36
|
+
manual edit, https://docs.reticle.sh/install-manual.md. Do not stop until you have
|
|
37
|
+
driven one real flow in my app and produced a verdict. That, not a config file, is
|
|
38
|
+
what "installed" means.
|
|
39
|
+
|
|
40
|
+
Afterwards, use it whenever you change any user-facing behaviour.
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
<Tip>
|
|
44
|
+
On Claude Code the plugin is shorter still: `/plugin marketplace add reticlehq/reticle` then
|
|
45
|
+
`/plugin install reticle@reticlehq`, which registers the MCP server and the skills in one step. On
|
|
46
|
+
most other agents, `npx skills add reticlehq/reticle`.
|
|
47
|
+
</Tip>
|
|
48
|
+
|
|
49
|
+
<Card title="What that command actually changes" icon="wand-magic-sparkles" href="/install-agentic">
|
|
50
|
+
The four files it writes, the marks it prints, and how to read its report.
|
|
51
|
+
</Card>
|
|
52
|
+
|
|
53
|
+
<CardGroup cols={2}>
|
|
54
|
+
<Card title="Quickstart" icon="rocket" href="/quickstart">
|
|
55
|
+
Install, connect your agent, and get a real verdict. Five minutes.
|
|
56
|
+
</Card>
|
|
57
|
+
<Card title="Why Reticle" icon="lightbulb" href="/why-reticle">
|
|
58
|
+
The false-green problem, and the evidence that this fixes it.
|
|
59
|
+
</Card>
|
|
60
|
+
</CardGroup>
|
|
61
|
+
|
|
62
|
+
<CardGroup cols={3}>
|
|
63
|
+
<Card title="Desktop apps" icon="display" href="/desktop">
|
|
64
|
+
Electron and Tauri, including the IPC boundary nothing else can see.
|
|
65
|
+
</Card>
|
|
66
|
+
<Card title="Install" icon="download" href="/install-agentic">
|
|
67
|
+
Let your agent do it, or wire it by hand.
|
|
68
|
+
</Card>
|
|
69
|
+
<Card title="Tools" icon="wrench" href="/tools-overview">
|
|
70
|
+
Every tool, with a real request and a real response.
|
|
71
|
+
</Card>
|
|
72
|
+
<Card title="Run it in CI" icon="circle-check" href="/testing">
|
|
73
|
+
Turn a session into a suite that blocks a bad merge.
|
|
74
|
+
</Card>
|
|
75
|
+
</CardGroup>
|
|
76
|
+
|
|
77
|
+
## What it looks like
|
|
78
|
+
|
|
79
|
+
Your agent names the expected consequence _before_ it acts. That ordering is the whole trick. It is the difference between a check and a rationalisation.
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"ref": "e4",
|
|
84
|
+
"action": "click",
|
|
85
|
+
"until": { "kind": "net", "method": "POST", "urlContains": "/api/todos" }
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Reticle clicks, watches, and reports what actually happened. A verdict of `unknown` is not a pass; it means Reticle drove the app and could not tell. It says so rather than guessing, which is a rarer quality in software than it should be.
|
|
90
|
+
|
|
91
|
+
## What makes it different
|
|
92
|
+
|
|
93
|
+
<CardGroup cols={2}>
|
|
94
|
+
<Card title="No screenshots" icon="eye-slash">
|
|
95
|
+
No vision model, no pixel guessing. Reticle reads program truth, so the answer is deterministic
|
|
96
|
+
and the same every run.
|
|
97
|
+
</Card>
|
|
98
|
+
<Card title="Points at the source" icon="crosshairs">
|
|
99
|
+
On React, a DOM node maps back to `src/App.tsx:104`. Finding the bug is half the job; knowing
|
|
100
|
+
which file to open is the half that makes an agent useful.
|
|
101
|
+
</Card>
|
|
102
|
+
<Card title="Cheap to ask" icon="coins">
|
|
103
|
+
Narrow questions instead of dumping the whole accessibility tree into the context window every
|
|
104
|
+
single step.
|
|
105
|
+
</Card>
|
|
106
|
+
<Card title="Yours, locally" icon="lock">
|
|
107
|
+
Dev-only, localhost-only, offline. Your app's data never leaves the machine.
|
|
108
|
+
</Card>
|
|
109
|
+
</CardGroup>
|
|
110
|
+
|
|
111
|
+
## The evidence
|
|
112
|
+
|
|
113
|
+
We publish the losses too. Reticle is not the right tool for driving a site you don't own, and it does not see pixels.
|
|
114
|
+
|
|
115
|
+

|
|
116
|
+
|
|
117
|
+
<Card title="Read the full benchmark" icon="chart-column" href="/benchmarks">
|
|
118
|
+
How every number was measured, what it means, and where Reticle comes second.
|
|
119
|
+
</Card>
|
|
120
|
+
|
|
121
|
+
## Built for agents, readable by humans
|
|
122
|
+
|
|
123
|
+
Reticle is used by a coding agent far more often than by a person, so these docs are built to be fetched by one. Every page has a plain-Markdown twin, and the whole site collapses into a single file when an agent wants the lot.
|
|
124
|
+
|
|
125
|
+
<Card title="Docs for agents" icon="robot" href="/for-agents">
|
|
126
|
+
Markdown endpoints, `llms.txt`, and which page answers which question.
|
|
127
|
+
</Card>
|
|
128
|
+
|
|
129
|
+
## Build with us
|
|
130
|
+
|
|
131
|
+
Reticle is early, and the sharp edges get filed down fastest when someone tells us where they are.
|
|
132
|
+
|
|
133
|
+
<CardGroup cols={2}>
|
|
134
|
+
<Card title="Join the Discord" icon="discord" href="https://discord.gg/BwAbzv9ZRz">
|
|
135
|
+
Ask questions, show us what you are verifying, and tell us what broke. The roadmap moves on what
|
|
136
|
+
people actually hit.
|
|
137
|
+
</Card>
|
|
138
|
+
<Card title="Star the repo" icon="star" href="https://github.com/reticlehq/reticle">
|
|
139
|
+
It is the cheapest way to help, and it is genuinely how other people find this.
|
|
140
|
+
</Card>
|
|
141
|
+
</CardGroup>
|
|
142
|
+
|
|
143
|
+
Found a bug, or something you wished existed? `reticle_feedback` sends it in one call, from wherever you are. If Reticle could not tell you what happened, that is our defect and we want to know.
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 'Agentic install: let the agent do it'
|
|
3
|
+
sidebarTitle: Agentic install
|
|
4
|
+
description: Run npx @reticlehq/server init and let your coding agent wire Reticle into the project. What it changes, what it asks, and how to read its report.
|
|
5
|
+
icon: wand-magic-sparkles
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Run `npx @reticlehq/server init` in your project root.** It registers the MCP server for every agent it finds, installs the SDK, wires your build config, writes the agent rule files, and prints a plan you can read. It is idempotent, so running it twice is safe.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npx @reticlehq/server init
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
The install is designed for the agent to run rather than you. The agent is about to be the primary user of this tool, so it may as well set up its own workspace.
|
|
15
|
+
|
|
16
|
+
<Warning>
|
|
17
|
+
Always write the package scope: `npx @reticlehq/server <command>` is the CLI. Dropping the scope
|
|
18
|
+
and npx-ing the bare, unscoped `reticle` name fetches a different package published by somebody
|
|
19
|
+
else, which will not give you Reticle. Once `@reticlehq/server` is installed, `reticle` works as a
|
|
20
|
+
bin name on your PATH, which is the only context where the unscoped name is ours.
|
|
21
|
+
</Warning>
|
|
22
|
+
|
|
23
|
+
## What do I paste into my coding agent to install Reticle?
|
|
24
|
+
|
|
25
|
+
Copy this whole block into Claude Code, Cursor, Copilot, Codex, Windsurf, OpenCode, or any MCP agent. It tells the agent what Reticle is, why it should want it, and what counts as finished. That last part is the one that matters.
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
Reticle is the proof layer for AI coding agents. It runs a dev-only SDK inside my
|
|
29
|
+
running web app, so instead of guessing whether your change worked, you can drive
|
|
30
|
+
the real app and read what actually happened: the network calls, the store, the
|
|
31
|
+
console, the routes, the DOM. You get back pass, fail, or "couldn't tell", with
|
|
32
|
+
the file:line to fix. No screenshots, no vision model, no test syntax.
|
|
33
|
+
|
|
34
|
+
Use it because you cannot otherwise tell whether your own code works. Reading the
|
|
35
|
+
diff proves nothing, and unit tests do not run the app. Reticle is how you check
|
|
36
|
+
your work before telling me it is done, and how you stop reporting "fixed" over a
|
|
37
|
+
silent 500.
|
|
38
|
+
|
|
39
|
+
Install it now:
|
|
40
|
+
|
|
41
|
+
RETICLE_INSTALL_SOURCE=docs_site npx @reticlehq/server@latest init
|
|
42
|
+
|
|
43
|
+
Then follow https://docs.reticle.sh/install-agentic.md and, if anything needs a
|
|
44
|
+
manual edit, https://docs.reticle.sh/install-manual.md. Do not stop until you have
|
|
45
|
+
driven one real flow in my app and produced a verdict. That, not a config file, is
|
|
46
|
+
what "installed" means.
|
|
47
|
+
|
|
48
|
+
Afterwards, use it whenever you change any user-facing behaviour.
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
<Tip>
|
|
52
|
+
Prefer installing the skills instead? `npx skills add reticlehq/reticle` on most agents, or
|
|
53
|
+
`/plugin marketplace add reticlehq/reticle` then `/plugin install reticle@reticlehq` on Claude
|
|
54
|
+
Code, which registers the MCP server and all eleven skills in one step. Then type `/reticle` and
|
|
55
|
+
the agent runs this same setup from the skill.
|
|
56
|
+
</Tip>
|
|
57
|
+
|
|
58
|
+
The `RETICLE_INSTALL_SOURCE=docs_site` marker is how we tell which published route an install came through. It is self-declared by this page and never inferred, it carries no information about you or your project, and dropping it changes nothing about the install.
|
|
59
|
+
|
|
60
|
+
<Note>
|
|
61
|
+
Everything on this page is real output. It was captured by scaffolding a pristine `npm create
|
|
62
|
+
vite` React app and running `init` inside it while writing this.
|
|
63
|
+
</Note>
|
|
64
|
+
|
|
65
|
+
## See the plan before anything is written
|
|
66
|
+
|
|
67
|
+
`--dry-run` prints exactly what would happen and touches nothing:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npx @reticlehq/server init --dry-run
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
On a fresh Vite + React + TypeScript app, that produced:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
reticle init (dry run, no files written)
|
|
77
|
+
in /tmp/initdemo
|
|
78
|
+
|
|
79
|
+
[·] MCP server (Claude, global) → global (claude user scope)
|
|
80
|
+
reticle already registered (install once, used by every project)
|
|
81
|
+
[·] MCP server (Cursor, global) → /Users/you/.cursor/mcp.json
|
|
82
|
+
reticle already in Cursor global config
|
|
83
|
+
[⚠] MCP server (Codex CLI) → /Users/you/.codex/config.toml
|
|
84
|
+
add this to /Users/you/.codex/config.toml by hand:
|
|
85
|
+
[mcp_servers.reticle]
|
|
86
|
+
command = "npx"
|
|
87
|
+
args = ["@reticlehq/server", "mcp"]
|
|
88
|
+
|
|
89
|
+
[✓] Agent verification rule → CLAUDE.md
|
|
90
|
+
teach the agent to verify features with Reticle after building them
|
|
91
|
+
[✓] The /reticle command → .claude/commands/reticle.md
|
|
92
|
+
type /reticle to verify one flow in the browser
|
|
93
|
+
[✓] Install dependencies → package.json
|
|
94
|
+
npm i -D @reticlehq/react@<version> @reticlehq/vite-plugin@<version>
|
|
95
|
+
[✓] Reticle config → .reticle.json
|
|
96
|
+
write project config (framework + port)
|
|
97
|
+
[✓] Vite plugin → vite.config.ts
|
|
98
|
+
add reticle() to plugins (also injects connect())
|
|
99
|
+
[✓] Capabilities + store → src/reticle-dev.ts
|
|
100
|
+
no data-testid values yet; no state library detected
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## Reading the marks
|
|
104
|
+
|
|
105
|
+
There are five, and they mean different things. This is the part worth understanding, because a run full of green ticks can still leave you with a broken install. Two of the five ask something of you.
|
|
106
|
+
|
|
107
|
+
| Mark | Meaning | Do you need to act? |
|
|
108
|
+
| ---- | ----------------------------------------------------------- | ------------------- |
|
|
109
|
+
| `✓` | Done, or would be done | No |
|
|
110
|
+
| `·` | Already in place from a previous run or another project | No |
|
|
111
|
+
| `–` | Deliberately skipped, usually by a flag you passed | No |
|
|
112
|
+
| `⚠` | Could not be done automatically, with the exact fix printed | **Yes** |
|
|
113
|
+
| `ℹ` | Done, but incomplete in a way that matters | **Yes, read it** |
|
|
114
|
+
|
|
115
|
+
<Warning>
|
|
116
|
+
A `⚠` is not cosmetic. In the run above, Reticle could not write the Codex CLI's TOML config, so
|
|
117
|
+
it printed the exact block to paste. Leave it and Codex simply never sees the tools.
|
|
118
|
+
</Warning>
|
|
119
|
+
|
|
120
|
+
That `ℹ` line is the one people skim past, so here it is in full:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
[ℹ] AGENT: finish the capabilities file → src/reticle-dev.ts
|
|
124
|
+
src/reticle-dev.ts was written but registers nothing, so `hasCapabilities` stays false
|
|
125
|
+
and reticle_state has nothing to read.
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
`init` wrote the file, but a brand-new Vite template has no testids and no state library, so there was nothing to register. Reticle tells you this instead of counting it as a win. See [Instrument your app](/instrumentation) for what to put in it.
|
|
129
|
+
|
|
130
|
+
## What it actually changes
|
|
131
|
+
|
|
132
|
+
Four files in your project, none of them mysterious.
|
|
133
|
+
|
|
134
|
+
<AccordionGroup>
|
|
135
|
+
<Accordion title=".reticle.json (project config)">
|
|
136
|
+
```json
|
|
137
|
+
{
|
|
138
|
+
"framework": "vite",
|
|
139
|
+
"projectId": "initdemo-308da9fe"
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
The `projectId` is how Reticle scopes sessions to this project, so two apps running at once
|
|
143
|
+
don't get confused for each other.
|
|
144
|
+
</Accordion>
|
|
145
|
+
|
|
146
|
+
<Accordion title="vite.config.ts (the plugin)">
|
|
147
|
+
```ts
|
|
148
|
+
import { defineConfig } from 'vite'
|
|
149
|
+
import react from '@vitejs/plugin-react'
|
|
150
|
+
import { reticle } from '@reticlehq/vite-plugin';
|
|
151
|
+
|
|
152
|
+
export default defineConfig({
|
|
153
|
+
plugins: [reticle(), react()],
|
|
154
|
+
})
|
|
155
|
+
```
|
|
156
|
+
One import, one entry. The plugin stamps source locations onto your elements, which is what turns a DOM node into
|
|
157
|
+
|
|
158
|
+
`src/components/Login.tsx:81`. It also injects `connect()` so you don't have to remember to.
|
|
159
|
+
|
|
160
|
+
</Accordion>
|
|
161
|
+
|
|
162
|
+
<Accordion title="src/reticle-dev.ts (your capabilities)">
|
|
163
|
+
```ts
|
|
164
|
+
// Dev-only. Imported automatically by @reticlehq/vite-plugin, so you do not need to import it.
|
|
165
|
+
// Self-guards on import.meta.env.DEV, so it is a no-op in a production build.
|
|
166
|
+
import { registerCapabilities } from '@reticlehq/react';
|
|
167
|
+
|
|
168
|
+
if (import.meta.env.DEV) {
|
|
169
|
+
registerCapabilities({
|
|
170
|
+
testids: [], // none found; add data-testid to your key elements
|
|
171
|
+
signals: [], // names you pass to reticle.signal()
|
|
172
|
+
stores: [], // the keys you registered above
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
This is the file that decides how good your verdicts get. Empty, you still get DOM, network and
|
|
177
|
+
console. Filled in, your agent can check what the app *believes*, not just what it rendered.
|
|
178
|
+
|
|
179
|
+
</Accordion>
|
|
180
|
+
|
|
181
|
+
<Accordion title="CLAUDE.md and the /reticle command (agent rules)">
|
|
182
|
+
A rule telling your agent to verify features after building them, and a `/reticle` command that
|
|
183
|
+
drives one flow. Skipped entirely with `--no-mcp`, because rules for tools the agent can't reach
|
|
184
|
+
are just noise in the context window.
|
|
185
|
+
</Accordion>
|
|
186
|
+
</AccordionGroup>
|
|
187
|
+
|
|
188
|
+
## Flags
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
|
|
192
|
+
--app picks WHICH app in a monorepo, when several are found
|
|
193
|
+
--no-mcp skips MORE than the server registration: also the agent rule files
|
|
194
|
+
(CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three
|
|
195
|
+
only make sense once the tools are reachable.
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
| Flag | When you want it |
|
|
199
|
+
| -------------- | -------------------------------------------------------------------------- |
|
|
200
|
+
| `--dry-run` | Always, the first time. |
|
|
201
|
+
| `--app <dir>` | Monorepos. Without it, `init` finds several apps and asks which you meant. |
|
|
202
|
+
| `--no-mcp` | Your MCP config is managed elsewhere (dotfiles, a team template). |
|
|
203
|
+
| `--no-install` | You want to add the dependencies yourself, at your own versions. |
|
|
204
|
+
| `--port N` | Something else already owns the default port. |
|
|
205
|
+
|
|
206
|
+
## Then restart two things
|
|
207
|
+
|
|
208
|
+
This trips up almost everyone, so `init` says it twice and so will we.
|
|
209
|
+
|
|
210
|
+
**Restart your dev server.** The Vite plugin is new; the running process doesn't have it.
|
|
211
|
+
|
|
212
|
+
**Restart your agent.** Claude Code, or reload the window in Cursor, or hit Start in `.vscode/mcp.json` in VS Code. Your agent read its server list at startup, before Reticle existed, and no slash command re-reads it. `/mcp` manages servers already loaded, so it cannot pick up a new one. This is a once-per-machine annoyance: Reticle registers globally, so every later project starts with the tools already there.
|
|
213
|
+
|
|
214
|
+
## Confirm it worked
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
npx @reticlehq/server status
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
It confirms the app connected, or tells you exactly why it hasn't. A session in the list is the install actually finished. Not a green tick. A connected app.
|
|
221
|
+
|
|
222
|
+
<Card title="Something marked ⚠?" icon="screwdriver-wrench" href="/install-manual">
|
|
223
|
+
The manual install covers every step `init` can't automate, per agent and per framework.
|
|
224
|
+
</Card>
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: 'Manual install: by hand, on purpose'
|
|
3
|
+
sidebarTitle: Manual install
|
|
4
|
+
description: Wire Reticle by hand. Register the MCP server for your agent, add the SDK, and connect it. Every step init automates, written out.
|
|
5
|
+
icon: screwdriver-wrench
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
**Installing Reticle by hand is two independent halves: register the MCP server so your agent gets the `reticle_*` tools, then add the SDK to your app so there is something for those tools to talk to.** You need both. `npx @reticlehq/server init` automates all of it, so use this page for the steps it marked `⚠`, or for an agent it does not know how to register.
|
|
9
|
+
|
|
10
|
+
Do only the first half and the tools appear but every call reports no session. Do only the second and your app connects to a daemon nobody is asking questions.
|
|
11
|
+
|
|
12
|
+
You want both. Take them in that order.
|
|
13
|
+
|
|
14
|
+
<Tip>
|
|
15
|
+
You only need this page for steps [`reticle init`](/install-agentic) marked `⚠`, or for an agent
|
|
16
|
+
it doesn't register automatically. It handles Claude Code and Cursor on its own.
|
|
17
|
+
</Tip>
|
|
18
|
+
|
|
19
|
+
## Part 1. Register the MCP server
|
|
20
|
+
|
|
21
|
+
There is no config file that all agents share. Each harness has its own path and its own schema, so write only the one you actually use.
|
|
22
|
+
|
|
23
|
+
| Tool | File | Root key | `type` needed? |
|
|
24
|
+
| --- | --- | --- | --- |
|
|
25
|
+
| Claude Code | `~/.claude.json` (prefer the CLI below) | `mcpServers` | no |
|
|
26
|
+
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | no |
|
|
27
|
+
| VS Code | `.vscode/mcp.json` | `servers` | no |
|
|
28
|
+
| Windsurf | `~/.codeium/windsurf/mcp_config.json` | `mcpServers` | no |
|
|
29
|
+
| OpenCode | `opencode.json` | `mcp` | `"local"` required |
|
|
30
|
+
| Codex CLI | `.codex/config.toml` | `[mcp_servers.reticle]` | no |
|
|
31
|
+
| Zed | `~/.config/zed/settings.json` | `context_servers` | no |
|
|
32
|
+
|
|
33
|
+
### Claude Code
|
|
34
|
+
|
|
35
|
+
Register once, globally, and every project has it:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
claude mcp add reticle -s user -- npx @reticlehq/server mcp
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Confirm with `claude mcp list`. `reticle` should be there.
|
|
42
|
+
|
|
43
|
+
If the `claude` CLI isn't available, merge one key into `mcpServers` in `~/.claude.json`. It is a large stateful file, so **merge, never rewrite**:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"mcpServers": {
|
|
48
|
+
"reticle": {
|
|
49
|
+
"command": "npx",
|
|
50
|
+
"args": ["@reticlehq/server", "mcp"]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Cursor, VS Code, Windsurf
|
|
57
|
+
|
|
58
|
+
Same shape, different file and root key. Cursor and Windsurf use `mcpServers`; VS Code uses `servers`:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"mcpServers": {
|
|
63
|
+
"reticle": {
|
|
64
|
+
"command": "npx",
|
|
65
|
+
"args": ["@reticlehq/server", "mcp"]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Codex CLI
|
|
72
|
+
|
|
73
|
+
TOML, in `.codex/config.toml`. This is the one `init` cannot write for you:
|
|
74
|
+
|
|
75
|
+
```toml
|
|
76
|
+
[mcp_servers.reticle]
|
|
77
|
+
command = "npx"
|
|
78
|
+
args = ["@reticlehq/server", "mcp"]
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### OpenCode
|
|
82
|
+
|
|
83
|
+
Note the flat command array and the required `type`:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"mcp": {
|
|
88
|
+
"reticle": {
|
|
89
|
+
"type": "local",
|
|
90
|
+
"command": ["npx", "@reticlehq/server", "mcp"]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
<Warning>
|
|
97
|
+
**Restart your agent afterwards.** It read its server list at startup and nothing re-reads it.
|
|
98
|
+
`/mcp` manages servers that are already loaded, so it cannot discover a new one. Restart Claude
|
|
99
|
+
Code, reload the Cursor window, or press Start in `.vscode/mcp.json`.
|
|
100
|
+
</Warning>
|
|
101
|
+
|
|
102
|
+
## Part 2. Wire the SDK into your app
|
|
103
|
+
|
|
104
|
+
### Vite
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm i -D @reticlehq/react @reticlehq/vite-plugin
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
import { defineConfig } from 'vite';
|
|
112
|
+
import react from '@vitejs/plugin-react';
|
|
113
|
+
import { reticle } from '@reticlehq/vite-plugin';
|
|
114
|
+
|
|
115
|
+
export default defineConfig({
|
|
116
|
+
plugins: [reticle(), react()],
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
That's the whole web install. The plugin stamps source locations onto elements. The thing that turns a DOM node into `src/components/Login.tsx:81`. And injects `connect()` so you can't forget it.
|
|
121
|
+
|
|
122
|
+
### Anything without the plugin
|
|
123
|
+
|
|
124
|
+
If you're not on Vite or Next, call `connect()` yourself, guarded so it never reaches production:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
import { reticle } from '@reticlehq/browser';
|
|
128
|
+
|
|
129
|
+
if (import.meta.env.DEV) reticle.connect();
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
<Note>
|
|
133
|
+
`connect()` is dev-only by design. Guard it with whatever your bundler gives you:
|
|
134
|
+
`import.meta.env.DEV`, `process.env.NODE_ENV !== 'production'`, or a build flag. Reticle also
|
|
135
|
+
self-guards, but two locks on a door that leads to your users is a reasonable number.
|
|
136
|
+
</Note>
|
|
137
|
+
|
|
138
|
+
### Tauri. and the step whose failure is silent
|
|
139
|
+
|
|
140
|
+
The frontend is identical to any web app. The CSP is not optional:
|
|
141
|
+
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"app": {
|
|
145
|
+
"security": {
|
|
146
|
+
"csp": "default-src 'self' ipc: http://ipc.localhost; connect-src 'self' ipc: http://ipc.localhost ws://localhost:4400 ws://127.0.0.1:4400"
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
<Warning>
|
|
153
|
+
Tauri's default CSP blocks the bridge WebSocket **before it opens**. Your app runs perfectly and
|
|
154
|
+
simply never connects, with no error to go on. Keep `ipc: http://ipc.localhost` in `connect-src`,
|
|
155
|
+
Tauri v2 needs it for `invoke` itself. And drop the `ws://` entries from your release config.
|
|
156
|
+
</Warning>
|
|
157
|
+
|
|
158
|
+
Screenshots and headless mode need the Rust crate, which is versioned independently of the npm packages:
|
|
159
|
+
|
|
160
|
+
```toml
|
|
161
|
+
[dependencies]
|
|
162
|
+
reticle-tauri = "0.1"
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```rust
|
|
166
|
+
tauri::Builder::default()
|
|
167
|
+
.invoke_handler(tauri::generate_handler![reticle_tauri::reticle_capture])
|
|
168
|
+
.on_page_load(reticle_tauri::on_page_load)
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
IPC observation needs nothing on the Rust side. An `invoke('load_todos')` already reaches Reticle as `ipc://load_todos`.
|
|
172
|
+
|
|
173
|
+
<Card title="Electron, and the rest of desktop" icon="display" href="/desktop">
|
|
174
|
+
Main-process and renderer wiring, IPC observation, and what differs from the web install.
|
|
175
|
+
</Card>
|
|
176
|
+
|
|
177
|
+
## Part 3. Prove it
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
npx @reticlehq/server status
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
A session in the output means the app connected. That. Not a tick in a checklist, is the install finished.
|
|
184
|
+
|
|
185
|
+
If it says nothing connected, the usual cause is a port disagreement between your app and the daemon. The browser console will carry `[Reticle] this page could not open a websocket to …` naming the exact address it tried; set it explicitly with `VITE_RETICLE_WS_URL=ws://localhost:4400/reticle` or `reticle.connect({ url })`.
|
|
186
|
+
|
|
187
|
+
Still stuck? `npx @reticlehq/server doctor` checks Chromium, the daemon and the port in one command.
|
|
188
|
+
|
|
189
|
+
<CardGroup cols={2}>
|
|
190
|
+
<Card title="Instrument your app" icon="wrench" href="/instrumentation">
|
|
191
|
+
Register stores, signals and testids so your verdicts get stronger than "the DOM changed".
|
|
192
|
+
</Card>
|
|
193
|
+
<Card title="Quickstart" icon="rocket" href="/quickstart">
|
|
194
|
+
Drive your first flow and read a real verdict.
|
|
195
|
+
</Card>
|
|
196
|
+
</CardGroup>
|