@reticlehq/server 2.6.0 → 2.8.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.
Files changed (276) hide show
  1. package/README.md +14 -5
  2. package/SKILL.md +251 -33
  3. package/dist/bridge/bridge.d.ts +6 -1
  4. package/dist/bridge/bridge.js +27 -4
  5. package/dist/capsule/causal-summary.d.ts +20 -0
  6. package/dist/capsule/causal-summary.js +31 -6
  7. package/dist/capsule/divergence.js +7 -1
  8. package/dist/cli/chromium-hint.d.ts +68 -0
  9. package/dist/cli/chromium-hint.js +145 -0
  10. package/dist/cli/cli-doctor.js +31 -36
  11. package/dist/cli/cli-kill.d.ts +58 -0
  12. package/dist/cli/cli-kill.js +162 -0
  13. package/dist/cli/cli-launch.d.ts +18 -0
  14. package/dist/cli/cli-launch.js +32 -1
  15. package/dist/cli/cli-parse.d.ts +16 -1
  16. package/dist/cli/cli-parse.js +32 -9
  17. package/dist/cli/cli-port.d.ts +8 -0
  18. package/dist/cli/cli-port.js +36 -1
  19. package/dist/cli/cli-verify.js +2 -2
  20. package/dist/cli/doctor-daemon-line.js +10 -1
  21. package/dist/cli/doctor-sessions-line.d.ts +12 -0
  22. package/dist/cli/doctor-sessions-line.js +66 -0
  23. package/dist/cli/port-holder.d.ts +10 -0
  24. package/dist/cli/port-holder.js +26 -2
  25. package/dist/cli.js +139 -23
  26. package/dist/crawl/crawl-tools.js +12 -2
  27. package/dist/crawl/crawl.d.ts +13 -0
  28. package/dist/crawl/crawl.js +50 -2
  29. package/dist/daemon/daemon-resilience.js +2 -2
  30. package/dist/daemon/loopback-alias.d.ts +32 -0
  31. package/dist/daemon/loopback-alias.js +80 -0
  32. package/dist/events/contradictions.d.ts +14 -0
  33. package/dist/events/contradictions.js +26 -17
  34. package/dist/events/predicate-eval.d.ts +26 -3
  35. package/dist/events/predicate-eval.js +284 -95
  36. package/dist/events/predicate-parse.d.ts +1 -1
  37. package/dist/events/predicate-parse.js +18 -4
  38. package/dist/events/predicate.js +170 -18
  39. package/dist/events/ring-buffer.d.ts +8 -0
  40. package/dist/events/ring-buffer.js +34 -1
  41. package/dist/flows/flow-classify.js +1 -1
  42. package/dist/flows/flow-tools.js +12 -4
  43. package/dist/flows/heal-run.js +1 -1
  44. package/dist/honesty/blind-spots.js +6 -2
  45. package/dist/honesty/honesty.d.ts +11 -0
  46. package/dist/honesty/honesty.js +9 -1
  47. package/dist/honesty/unsettled.d.ts +40 -0
  48. package/dist/honesty/unsettled.js +78 -0
  49. package/dist/honesty/verified.d.ts +7 -0
  50. package/dist/honesty/verified.js +27 -4
  51. package/dist/http-server.js +11 -1
  52. package/dist/index.js +29 -2
  53. package/dist/init/agent-rules.d.ts +16 -0
  54. package/dist/init/agent-rules.js +96 -17
  55. package/dist/init/astro-patch.d.ts +2 -1
  56. package/dist/init/astro-patch.js +11 -5
  57. package/dist/init/capabilities.d.ts +22 -0
  58. package/dist/init/capabilities.js +76 -0
  59. package/dist/init/confirm.d.ts +96 -0
  60. package/dist/init/confirm.js +138 -0
  61. package/dist/init/cra.js +3 -2
  62. package/dist/init/detect.d.ts +8 -0
  63. package/dist/init/detect.js +15 -0
  64. package/dist/init/non-js-project.d.ts +27 -0
  65. package/dist/init/non-js-project.js +84 -0
  66. package/dist/init/plan-framework.d.ts +9 -0
  67. package/dist/init/plan-framework.js +72 -16
  68. package/dist/init/plan.d.ts +40 -4
  69. package/dist/init/plan.js +183 -43
  70. package/dist/init/run.d.ts +24 -2
  71. package/dist/init/run.js +181 -46
  72. package/dist/init/slash-command.d.ts +1 -1
  73. package/dist/init/slash-command.js +46 -6
  74. package/dist/init/snippets.d.ts +64 -5
  75. package/dist/init/snippets.js +220 -31
  76. package/dist/init/vite-config.js +29 -3
  77. package/dist/input/network-mock-tools.d.ts +19 -0
  78. package/dist/input/network-mock-tools.js +29 -4
  79. package/dist/license/license.js +1 -1
  80. package/dist/mcp/mcp-proxy.d.ts +69 -3
  81. package/dist/mcp/mcp-proxy.js +215 -23
  82. package/dist/mcp/mcp.js +58 -7
  83. package/dist/mcp/proxy-lifecycle.d.ts +20 -1
  84. package/dist/mcp/proxy-lifecycle.js +22 -1
  85. package/dist/pool/browser-pool.d.ts +22 -2
  86. package/dist/pool/browser-pool.js +44 -4
  87. package/dist/pool/playwright-launcher.js +10 -2
  88. package/dist/project/learned-routes.d.ts +24 -0
  89. package/dist/project/learned-routes.js +63 -0
  90. package/dist/project/project-store.d.ts +6 -0
  91. package/dist/project/project-store.js +25 -1
  92. package/dist/session/live-control-tools.js +39 -2
  93. package/dist/session/live-control.d.ts +7 -9
  94. package/dist/session/live-control.js +34 -1
  95. package/dist/session/no-session-diagnosis.d.ts +23 -4
  96. package/dist/session/no-session-diagnosis.js +128 -44
  97. package/dist/session/no-session-watch.js +12 -0
  98. package/dist/session/ref-provenance.d.ts +54 -0
  99. package/dist/session/ref-provenance.js +61 -0
  100. package/dist/session/review-store.d.ts +19 -0
  101. package/dist/session/review-store.js +34 -5
  102. package/dist/session/session-lease.js +1 -1
  103. package/dist/session/session-manager.d.ts +9 -0
  104. package/dist/session/session-manager.js +11 -0
  105. package/dist/session/session.d.ts +8 -0
  106. package/dist/session/session.js +12 -0
  107. package/dist/status-payload.d.ts +13 -1
  108. package/dist/status-payload.js +6 -1
  109. package/dist/telemetry/app-instrumented.d.ts +37 -0
  110. package/dist/telemetry/app-instrumented.js +54 -0
  111. package/dist/telemetry/automation-hint.d.ts +17 -0
  112. package/dist/telemetry/automation-hint.js +71 -0
  113. package/dist/telemetry/bug-found.d.ts +0 -20
  114. package/dist/telemetry/bug-found.js +38 -21
  115. package/dist/telemetry/cli-telemetry.js +7 -1
  116. package/dist/telemetry/daemon-telemetry.d.ts +4 -4
  117. package/dist/telemetry/daemon-telemetry.js +8 -4
  118. package/dist/telemetry/feedback.js +1 -1
  119. package/dist/telemetry/init-telemetry.js +9 -1
  120. package/dist/telemetry/install-source.d.ts +36 -0
  121. package/dist/telemetry/install-source.js +40 -0
  122. package/dist/telemetry/run-telemetry.js +4 -1
  123. package/dist/telemetry/session-metrics.d.ts +3 -3
  124. package/dist/telemetry/session-metrics.js +9 -4
  125. package/dist/telemetry/telemetry.d.ts +7 -1
  126. package/dist/telemetry/telemetry.js +17 -2
  127. package/dist/telemetry/tool-refused.d.ts +19 -0
  128. package/dist/telemetry/tool-refused.js +55 -0
  129. package/dist/telemetry/verification-of.js +72 -8
  130. package/dist/temp-dir.d.ts +27 -0
  131. package/dist/temp-dir.js +46 -0
  132. package/dist/tools/act-tools.js +77 -11
  133. package/dist/tools/assert-grade.d.ts +1 -1
  134. package/dist/tools/assert-grade.js +27 -5
  135. package/dist/tools/assert-verdict.js +25 -1
  136. package/dist/tools/contract-tools.js +4 -0
  137. package/dist/tools/dynamic-tools.js +1 -1
  138. package/dist/tools/error-recovery.d.ts +10 -0
  139. package/dist/tools/error-recovery.js +70 -5
  140. package/dist/tools/feedback-invite.js +1 -1
  141. package/dist/tools/invoke-tool.js +149 -32
  142. package/dist/tools/lease-tools.d.ts +29 -1
  143. package/dist/tools/lease-tools.js +58 -5
  144. package/dist/tools/navigate-result.js +1 -1
  145. package/dist/tools/observe-tools.js +1 -1
  146. package/dist/tools/observed-nothing.js +1 -1
  147. package/dist/tools/react-grace.d.ts +48 -0
  148. package/dist/tools/react-grace.js +87 -0
  149. package/dist/tools/read-tools.js +20 -4
  150. package/dist/tools/settle-in-flight.d.ts +79 -0
  151. package/dist/tools/settle-in-flight.js +106 -0
  152. package/dist/tools/snapshot-delta.d.ts +7 -0
  153. package/dist/tools/snapshot-delta.js +130 -6
  154. package/dist/tools/tool-kit.d.ts +52 -5
  155. package/dist/tools/tool-kit.js +55 -24
  156. package/dist/tools/tool-surface.js +28 -9
  157. package/dist/tools/tools.js +38 -4
  158. package/dist/visual/capture-cleanup.d.ts +16 -0
  159. package/dist/visual/capture-cleanup.js +39 -0
  160. package/dist/visual/visual-tools.d.ts +18 -0
  161. package/dist/visual/visual-tools.js +24 -5
  162. package/docs/README.md +56 -11
  163. package/docs/actions.mdx +87 -0
  164. package/docs/agent-cheatsheet.md +102 -26
  165. package/docs/architecture.md +46 -35
  166. package/docs/benchmarks.md +76 -72
  167. package/docs/best-practices.mdx +211 -0
  168. package/docs/capabilities.mdx +387 -0
  169. package/docs/cli/affected.mdx +51 -0
  170. package/docs/cli/capsules.mdx +69 -0
  171. package/docs/cli/cloud.mdx +127 -0
  172. package/docs/cli/doctor.mdx +76 -0
  173. package/docs/cli/drive.mdx +55 -0
  174. package/docs/cli/feedback.mdx +67 -0
  175. package/docs/cli/gate.mdx +64 -0
  176. package/docs/cli/help.mdx +92 -0
  177. package/docs/cli/hunt.mdx +57 -0
  178. package/docs/cli/identify.mdx +62 -0
  179. package/docs/cli/init.mdx +94 -0
  180. package/docs/cli/kill.mdx +91 -0
  181. package/docs/cli/license.mdx +48 -0
  182. package/docs/cli/mcp.mdx +61 -0
  183. package/docs/cli/open.mdx +68 -0
  184. package/docs/cli/restart.mdx +60 -0
  185. package/docs/cli/rollback.mdx +35 -0
  186. package/docs/cli/serve.mdx +62 -0
  187. package/docs/cli/status.mdx +64 -0
  188. package/docs/cli/stop.mdx +56 -0
  189. package/docs/cli/telemetry.mdx +57 -0
  190. package/docs/cli/update.mdx +52 -0
  191. package/docs/cli/verify.mdx +57 -0
  192. package/docs/cli/version.mdx +39 -0
  193. package/docs/cli/watch.mdx +55 -0
  194. package/docs/cli.mdx +219 -0
  195. package/docs/debugging.md +13 -9
  196. package/docs/deploy-checks.md +15 -11
  197. package/docs/desktop-apps.md +49 -40
  198. package/docs/desktop.mdx +188 -0
  199. package/docs/docs.json +363 -0
  200. package/docs/enterprise.md +20 -16
  201. package/docs/faq.mdx +88 -0
  202. package/docs/fixtures.md +11 -7
  203. package/docs/flows.md +26 -22
  204. package/docs/for-agents.md +71 -0
  205. package/docs/frameworks.mdx +199 -0
  206. package/docs/gate-plan.md +45 -41
  207. package/docs/gates.md +23 -19
  208. package/docs/getting-started.md +76 -65
  209. package/docs/human-control.md +22 -18
  210. package/docs/index.mdx +101 -0
  211. package/docs/install-agentic.mdx +215 -0
  212. package/docs/install-manual.mdx +194 -0
  213. package/docs/instrumentation.mdx +232 -0
  214. package/docs/integration-patterns.md +38 -34
  215. package/docs/local-registry.md +16 -12
  216. package/docs/multi-agent-testing.md +16 -12
  217. package/docs/packages/babel-plugin.mdx +70 -0
  218. package/docs/packages/browser.mdx +111 -0
  219. package/docs/packages/core.mdx +106 -0
  220. package/docs/packages/electron.mdx +87 -0
  221. package/docs/packages/eslint-plugin.mdx +84 -0
  222. package/docs/packages/next.mdx +91 -0
  223. package/docs/packages/react.mdx +91 -0
  224. package/docs/packages/server.mdx +98 -0
  225. package/docs/packages/tauri.mdx +63 -0
  226. package/docs/packages/test.mdx +108 -0
  227. package/docs/packages/vite-plugin.mdx +96 -0
  228. package/docs/packages.mdx +217 -0
  229. package/docs/platform-integration.md +33 -26
  230. package/docs/predicates.mdx +179 -0
  231. package/docs/quickstart.mdx +211 -0
  232. package/docs/recipes.mdx +242 -0
  233. package/docs/skill-file.mdx +105 -0
  234. package/docs/state-management.mdx +197 -0
  235. package/docs/style.css +14 -0
  236. package/docs/system-map.md +47 -32
  237. package/docs/telemetry-contract.md +101 -46
  238. package/docs/telemetry-events.mdx +430 -0
  239. package/docs/telemetry.md +63 -50
  240. package/docs/testing.md +10 -6
  241. package/docs/token-efficiency.md +30 -26
  242. package/docs/tools-act-and-wait.mdx +123 -0
  243. package/docs/tools-act-sequence.mdx +120 -0
  244. package/docs/tools-act.mdx +82 -0
  245. package/docs/tools-assert.mdx +70 -0
  246. package/docs/tools-console.mdx +59 -0
  247. package/docs/tools-inspect.mdx +85 -0
  248. package/docs/tools-navigate.mdx +63 -0
  249. package/docs/tools-network.mdx +86 -0
  250. package/docs/tools-observe.mdx +89 -0
  251. package/docs/tools-overview.mdx +157 -0
  252. package/docs/tools-query.mdx +82 -0
  253. package/docs/tools-session-and-feedback.mdx +91 -0
  254. package/docs/tools-sessions.mdx +65 -0
  255. package/docs/tools-snapshot.mdx +75 -0
  256. package/docs/tools-state.mdx +81 -0
  257. package/docs/tools-tools-and-run.mdx +125 -0
  258. package/docs/tools-wait-for.mdx +66 -0
  259. package/docs/troubleshooting.mdx +193 -0
  260. package/docs/usage.md +175 -153
  261. package/docs/vs-chrome-devtools-mcp.mdx +82 -0
  262. package/docs/vs-playwright-mcp.mdx +85 -0
  263. package/docs/vs-screenshots.mdx +96 -0
  264. package/docs/what-is-reticle.mdx +63 -0
  265. package/docs/why-reticle.mdx +107 -0
  266. package/package.json +2 -2
  267. package/docs/matrix/2.5.0/claude-code-machine.json +0 -19
  268. package/docs/matrix/2.5.0/codex-machine.json +0 -20
  269. package/docs/matrix/2.5.0/cursor-machine.json +0 -22
  270. package/docs/matrix/2.5.0/gemini-machine.json +0 -22
  271. package/docs/matrix/2.5.0/opencode-machine.json +0 -22
  272. package/docs/matrix/2.5.0/vscode-machine.json +0 -22
  273. package/docs/matrix/2.5.0/windsurf-machine.json +0 -22
  274. package/docs/matrix/MATRIX.md +0 -26
  275. package/docs/matrix/README.md +0 -59
  276. package/docs/mint.json +0 -61
package/docs/index.mdx ADDED
@@ -0,0 +1,101 @@
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
+ <CardGroup cols={2}>
16
+ <Card title="Quickstart" icon="rocket" href="/quickstart">
17
+ Install, connect your agent, and get a real verdict. Five minutes.
18
+ </Card>
19
+ <Card title="Why Reticle" icon="lightbulb" href="/why-reticle">
20
+ The false-green problem, and the evidence that this fixes it.
21
+ </Card>
22
+ </CardGroup>
23
+
24
+ <CardGroup cols={3}>
25
+ <Card title="Desktop apps" icon="display" href="/desktop">
26
+ Electron and Tauri, including the IPC boundary nothing else can see.
27
+ </Card>
28
+ <Card title="Install" icon="download" href="/install-agentic">
29
+ Let your agent do it, or wire it by hand.
30
+ </Card>
31
+ <Card title="Tools" icon="wrench" href="/tools-overview">
32
+ Every tool, with a real request and a real response.
33
+ </Card>
34
+ <Card title="Run it in CI" icon="circle-check" href="/testing">
35
+ Turn a session into a suite that blocks a bad merge.
36
+ </Card>
37
+ </CardGroup>
38
+
39
+ ## What it looks like
40
+
41
+ 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.
42
+
43
+ ```json
44
+ { "ref": "e4", "action": "click", "until": { "network": "POST /api/todos" } }
45
+ ```
46
+
47
+ 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.
48
+
49
+ ## What makes it different
50
+
51
+ <CardGroup cols={2}>
52
+ <Card title="No screenshots" icon="eye-slash">
53
+ No vision model, no pixel guessing. Reticle reads program truth, so the answer is deterministic
54
+ and the same every run.
55
+ </Card>
56
+ <Card title="Points at the source" icon="crosshairs">
57
+ On React, a DOM node maps back to `src/App.tsx:104`. Finding the bug is half the job; knowing
58
+ which file to open is the half that makes an agent useful.
59
+ </Card>
60
+ <Card title="Cheap to ask" icon="coins">
61
+ Narrow questions instead of dumping the whole accessibility tree into the context window every
62
+ single step.
63
+ </Card>
64
+ <Card title="Yours, locally" icon="lock">
65
+ Dev-only, localhost-only, offline. Your app's data never leaves the machine.
66
+ </Card>
67
+ </CardGroup>
68
+
69
+ ## The evidence
70
+
71
+ 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.
72
+
73
+ ![One honest test, two apps: Reticle has the highest Verification Efficiency on the controlled app and the lowest observation cost on the real dashboard](/images/bench-two-apps.png)
74
+
75
+ <Card title="Read the full benchmark" icon="chart-column" href="/benchmarks">
76
+ How every number was measured, what it means, and where Reticle comes second.
77
+ </Card>
78
+
79
+ ## Built for agents, readable by humans
80
+
81
+ 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.
82
+
83
+ <Card title="Docs for agents" icon="robot" href="/for-agents">
84
+ Markdown endpoints, `llms.txt`, and which page answers which question.
85
+ </Card>
86
+
87
+ ## Build with us
88
+
89
+ Reticle is early, and the sharp edges get filed down fastest when someone tells us where they are.
90
+
91
+ <CardGroup cols={2}>
92
+ <Card title="Join the Discord" icon="discord" href="https://discord.gg/BwAbzv9ZRz">
93
+ Ask questions, show us what you are verifying, and tell us what broke. The roadmap moves on what
94
+ people actually hit.
95
+ </Card>
96
+ <Card title="Star the repo" icon="star" href="https://github.com/reticlehq/reticle">
97
+ It is the cheapest way to help, and it is genuinely how other people find this.
98
+ </Card>
99
+ </CardGroup>
100
+
101
+ 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,215 @@
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
+ The install is one command, and it's 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.
9
+
10
+ ```bash
11
+ npx @reticlehq/server init
12
+ ```
13
+
14
+ ## What do I paste into my coding agent to install Reticle?
15
+
16
+ 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.
17
+
18
+ ```text
19
+ Reticle is the proof layer for AI coding agents. It runs a dev-only SDK inside my
20
+ running web app, so instead of guessing whether your change worked, you can drive
21
+ the real app and read what actually happened: the network calls, the store, the
22
+ console, the routes, the DOM. You get back pass, fail, or "couldn't tell", with
23
+ the file:line to fix. No screenshots, no vision model, no test syntax.
24
+
25
+ Use it because you cannot otherwise tell whether your own code works. Reading the
26
+ diff proves nothing, and unit tests do not run the app. Reticle is how you check
27
+ your work before telling me it is done, and how you stop reporting "fixed" over a
28
+ silent 500.
29
+
30
+ Install it now:
31
+
32
+ RETICLE_INSTALL_SOURCE=docs_site npx @reticlehq/server@latest init
33
+
34
+ Then follow https://docs.reticle.sh/install-agentic.md and, if anything needs a
35
+ manual edit, https://docs.reticle.sh/install-manual.md. Do not stop until you have
36
+ driven one real flow in my app and produced a verdict. That, not a config file, is
37
+ what "installed" means.
38
+
39
+ Afterwards, use it whenever you change any user-facing behaviour.
40
+ ```
41
+
42
+ <Tip>
43
+ Prefer installing the skills instead? `npx skills add reticlehq/reticle` on most agents, or
44
+ `/plugin marketplace add reticlehq/reticle` then `/plugin install reticle@reticlehq` on Claude
45
+ Code, which registers the MCP server and all eleven skills in one step. Then type `/reticle` and
46
+ the agent runs this same setup from the skill.
47
+ </Tip>
48
+
49
+ 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.
50
+
51
+ <Note>
52
+ Everything on this page is real output. It was captured by scaffolding a pristine `npm create
53
+ vite` React app and running `init` inside it while writing this.
54
+ </Note>
55
+
56
+ ## See the plan before anything is written
57
+
58
+ `--dry-run` prints exactly what would happen and touches nothing:
59
+
60
+ ```bash
61
+ npx @reticlehq/server init --dry-run
62
+ ```
63
+
64
+ On a fresh Vite + React + TypeScript app, that produced:
65
+
66
+ ```
67
+ reticle init (dry run, no files written)
68
+ in /tmp/initdemo
69
+
70
+ [·] MCP server (Claude, global) → global (claude user scope)
71
+ reticle already registered (install once, used by every project)
72
+ [·] MCP server (Cursor, global) → /Users/you/.cursor/mcp.json
73
+ reticle already in Cursor global config
74
+ [⚠] MCP server (Codex CLI) → /Users/you/.codex/config.toml
75
+ add this to /Users/you/.codex/config.toml by hand:
76
+ [mcp_servers.reticle]
77
+ command = "npx"
78
+ args = ["@reticlehq/server", "mcp"]
79
+
80
+ [✓] Agent verification rule → CLAUDE.md
81
+ teach the agent to verify features with Reticle after building them
82
+ [✓] The /reticle command → .claude/commands/reticle.md
83
+ type /reticle to verify one flow in the browser
84
+ [✓] Install dependencies → package.json
85
+ npm i -D @reticlehq/react@2.8.0 @reticlehq/vite-plugin@2.8.0
86
+ [✓] Reticle config → .reticle.json
87
+ write project config (framework + port)
88
+ [✓] Vite plugin → vite.config.ts
89
+ add reticle() to plugins (also injects connect())
90
+ [✓] Capabilities + store → src/reticle-dev.ts
91
+ no data-testid values yet; no state library detected
92
+ ```
93
+
94
+ ## Reading the marks
95
+
96
+ There are four, 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.
97
+
98
+ | Mark | Meaning | Do you need to act? |
99
+ | ---- | ----------------------------------------------------------- | ------------------- |
100
+ | `✓` | Done, or would be done | No |
101
+ | `·` | Already in place from a previous run or another project | No |
102
+ | `–` | Deliberately skipped, usually by a flag you passed | No |
103
+ | `⚠` | Could not be done automatically, with the exact fix printed | **Yes** |
104
+ | `ℹ` | Done, but incomplete in a way that matters | **Yes, read it** |
105
+
106
+ <Warning>
107
+ A `⚠` is not cosmetic. In the run above, Reticle could not write the Codex CLI's TOML config, so
108
+ it printed the exact block to paste. Leave it and Codex simply never sees the tools.
109
+ </Warning>
110
+
111
+ That `ℹ` line is the one people skim past, so here it is in full:
112
+
113
+ ```
114
+ [ℹ] AGENT: finish the capabilities file → src/reticle-dev.ts
115
+ src/reticle-dev.ts was written but registers nothing, so `hasCapabilities` stays false
116
+ and reticle_state has nothing to read.
117
+ ```
118
+
119
+ `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.
120
+
121
+ ## What it actually changes
122
+
123
+ Four files in your project, none of them mysterious.
124
+
125
+ <AccordionGroup>
126
+ <Accordion title=".reticle.json (project config)">
127
+ ```json
128
+ {
129
+ "framework": "vite",
130
+ "projectId": "initdemo-308da9fe"
131
+ }
132
+ ```
133
+ The `projectId` is how Reticle scopes sessions to this project, so two apps running at once
134
+ don't get confused for each other.
135
+ </Accordion>
136
+
137
+ <Accordion title="vite.config.ts (the plugin)">
138
+ ```ts
139
+ import { defineConfig } from 'vite'
140
+ import react from '@vitejs/plugin-react'
141
+ import { reticle } from '@reticlehq/vite-plugin';
142
+
143
+ export default defineConfig({
144
+ plugins: [reticle(), react()],
145
+ })
146
+ ```
147
+ One import, one entry. The plugin stamps source locations onto your elements, which is what turns a DOM node into
148
+
149
+ `src/components/Login.tsx:81`. It also injects `connect()` so you don't have to remember to.
150
+
151
+ </Accordion>
152
+
153
+ <Accordion title="src/reticle-dev.ts (your capabilities)">
154
+ ```ts
155
+ // Dev-only. Imported automatically by @reticlehq/vite-plugin, so you do not need to import it.
156
+ // Self-guards on import.meta.env.DEV, so it is a no-op in a production build.
157
+ import { registerCapabilities } from '@reticlehq/react';
158
+
159
+ if (import.meta.env.DEV) {
160
+ registerCapabilities({
161
+ testids: [], // none found; add data-testid to your key elements
162
+ signals: [], // names you pass to reticle.signal()
163
+ stores: [], // the keys you registered above
164
+ });
165
+ }
166
+ ```
167
+ This is the file that decides how good your verdicts get. Empty, you still get DOM, network and
168
+ console. Filled in, your agent can check what the app *believes*, not just what it rendered.
169
+
170
+ </Accordion>
171
+
172
+ <Accordion title="CLAUDE.md and the /reticle command (agent rules)">
173
+ A rule telling your agent to verify features after building them, and a `/reticle` command that
174
+ drives one flow. Skipped entirely with `--no-mcp`, because rules for tools the agent can't reach
175
+ are just noise in the context window.
176
+ </Accordion>
177
+ </AccordionGroup>
178
+
179
+ ## Flags
180
+
181
+ ```
182
+ reticle init [--dry-run] [--port N] [--no-mcp] [--no-install] [--app <dir>]
183
+ --app picks WHICH app in a monorepo, when several are found
184
+ --no-mcp skips MORE than the server registration: also the agent rule files
185
+ (CLAUDE.md / AGENTS.md / .cursor) and the /reticle command, because all three
186
+ only make sense once the tools are reachable.
187
+ ```
188
+
189
+ | Flag | When you want it |
190
+ | -------------- | -------------------------------------------------------------------------- |
191
+ | `--dry-run` | Always, the first time. |
192
+ | `--app <dir>` | Monorepos. Without it, `init` finds several apps and asks which you meant. |
193
+ | `--no-mcp` | Your MCP config is managed elsewhere (dotfiles, a team template). |
194
+ | `--no-install` | You want to add the dependencies yourself, at your own versions. |
195
+ | `--port N` | Something else already owns the default port. |
196
+
197
+ ## Then restart two things
198
+
199
+ This trips up almost everyone, so `init` says it twice and so will we.
200
+
201
+ **Restart your dev server.** The Vite plugin is new; the running process doesn't have it.
202
+
203
+ **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.
204
+
205
+ ## Confirm it worked
206
+
207
+ ```bash
208
+ npx @reticlehq/server status
209
+ ```
210
+
211
+ 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.
212
+
213
+ <Card title="Something marked ⚠?" icon="screwdriver-wrench" href="/install-manual">
214
+ The manual install covers every step `init` can't automate, per agent and per framework.
215
+ </Card>
@@ -0,0 +1,194 @@
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
+ Two halves, and they are independent. **Your agent** needs the MCP server registered so the `reticle_*` tools exist. **Your app** needs the SDK so there is something for those tools to talk to. Do one and the tools appear but every call reports no session. Do the other and your app connects to a daemon nobody is asking questions.
9
+
10
+ You want both. Take them in that order.
11
+
12
+ <Tip>
13
+ You only need this page for steps [`reticle init`](/install-agentic) marked `⚠`, or for an agent
14
+ it doesn't register automatically. It handles Claude Code and Cursor on its own.
15
+ </Tip>
16
+
17
+ ## Part 1. Register the MCP server
18
+
19
+ 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.
20
+
21
+ | Tool | File | Root key | `type` needed? |
22
+ | --- | --- | --- | --- |
23
+ | Claude Code | `~/.claude.json` (prefer the CLI below) | `mcpServers` | no |
24
+ | Cursor | `~/.cursor/mcp.json` | `mcpServers` | no |
25
+ | VS Code | `.vscode/mcp.json` | `servers` | no |
26
+ | Windsurf | `~/.codeium/windsurf/mcp_config.json` | `mcpServers` | no |
27
+ | OpenCode | `opencode.json` | `mcp` | `"local"` required |
28
+ | Codex CLI | `.codex/config.toml` | `[mcp_servers.reticle]` | no |
29
+ | Zed | `~/.config/zed/settings.json` | `context_servers` | no |
30
+
31
+ ### Claude Code
32
+
33
+ Register once, globally, and every project has it:
34
+
35
+ ```bash
36
+ claude mcp add reticle -s user -- npx @reticlehq/server mcp
37
+ ```
38
+
39
+ Confirm with `claude mcp list`. `reticle` should be there.
40
+
41
+ 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**:
42
+
43
+ ```json
44
+ {
45
+ "mcpServers": {
46
+ "reticle": {
47
+ "command": "npx",
48
+ "args": ["@reticlehq/server", "mcp"]
49
+ }
50
+ }
51
+ }
52
+ ```
53
+
54
+ ### Cursor, VS Code, Windsurf
55
+
56
+ Same shape, different file and root key. Cursor and Windsurf use `mcpServers`; VS Code uses `servers`:
57
+
58
+ ```json
59
+ {
60
+ "mcpServers": {
61
+ "reticle": {
62
+ "command": "npx",
63
+ "args": ["@reticlehq/server", "mcp"]
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ ### Codex CLI
70
+
71
+ TOML, in `.codex/config.toml`. This is the one `init` cannot write for you:
72
+
73
+ ```toml
74
+ [mcp_servers.reticle]
75
+ command = "npx"
76
+ args = ["@reticlehq/server", "mcp"]
77
+ ```
78
+
79
+ ### OpenCode
80
+
81
+ Note the flat command array and the required `type`:
82
+
83
+ ```json
84
+ {
85
+ "mcp": {
86
+ "reticle": {
87
+ "type": "local",
88
+ "command": ["npx", "@reticlehq/server", "mcp"]
89
+ }
90
+ }
91
+ }
92
+ ```
93
+
94
+ <Warning>
95
+ **Restart your agent afterwards.** It read its server list at startup and nothing re-reads it.
96
+ `/mcp` manages servers that are already loaded, so it cannot discover a new one. Restart Claude
97
+ Code, reload the Cursor window, or press Start in `.vscode/mcp.json`.
98
+ </Warning>
99
+
100
+ ## Part 2. Wire the SDK into your app
101
+
102
+ ### Vite
103
+
104
+ ```bash
105
+ npm i -D @reticlehq/react @reticlehq/vite-plugin
106
+ ```
107
+
108
+ ```ts
109
+ import { defineConfig } from 'vite';
110
+ import react from '@vitejs/plugin-react';
111
+ import { reticle } from '@reticlehq/vite-plugin';
112
+
113
+ export default defineConfig({
114
+ plugins: [reticle(), react()],
115
+ });
116
+ ```
117
+
118
+ 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.
119
+
120
+ ### Anything without the plugin
121
+
122
+ If you're not on Vite or Next, call `connect()` yourself, guarded so it never reaches production:
123
+
124
+ ```ts
125
+ import { reticle } from '@reticlehq/browser';
126
+
127
+ if (import.meta.env.DEV) reticle.connect();
128
+ ```
129
+
130
+ <Note>
131
+ `connect()` is dev-only by design. Guard it with whatever your bundler gives you:
132
+ `import.meta.env.DEV`, `process.env.NODE_ENV !== 'production'`, or a build flag. Reticle also
133
+ self-guards, but two locks on a door that leads to your users is a reasonable number.
134
+ </Note>
135
+
136
+ ### Tauri. and the step whose failure is silent
137
+
138
+ The frontend is identical to any web app. The CSP is not optional:
139
+
140
+ ```json
141
+ {
142
+ "app": {
143
+ "security": {
144
+ "csp": "default-src 'self' ipc: http://ipc.localhost; connect-src 'self' ipc: http://ipc.localhost ws://localhost:4400 ws://127.0.0.1:4400"
145
+ }
146
+ }
147
+ }
148
+ ```
149
+
150
+ <Warning>
151
+ Tauri's default CSP blocks the bridge WebSocket **before it opens**. Your app runs perfectly and
152
+ simply never connects, with no error to go on. Keep `ipc: http://ipc.localhost` in `connect-src`,
153
+ Tauri v2 needs it for `invoke` itself. And drop the `ws://` entries from your release config.
154
+ </Warning>
155
+
156
+ Screenshots and headless mode need the Rust crate, which is versioned independently of the npm packages:
157
+
158
+ ```toml
159
+ [dependencies]
160
+ reticle-tauri = "0.1"
161
+ ```
162
+
163
+ ```rust
164
+ tauri::Builder::default()
165
+ .invoke_handler(tauri::generate_handler![reticle_tauri::reticle_capture])
166
+ .on_page_load(reticle_tauri::on_page_load)
167
+ ```
168
+
169
+ IPC observation needs nothing on the Rust side. An `invoke('load_todos')` already reaches Reticle as `ipc://load_todos`.
170
+
171
+ <Card title="Electron, and the rest of desktop" icon="display" href="/desktop-apps">
172
+ Main-process and renderer wiring, IPC observation, and what differs from the web install.
173
+ </Card>
174
+
175
+ ## Part 3. Prove it
176
+
177
+ ```bash
178
+ npx @reticlehq/server status
179
+ ```
180
+
181
+ A session in the output means the app connected. That. Not a tick in a checklist, is the install finished.
182
+
183
+ If it says nothing connected, the usual cause is a port disagreement between your app and the daemon. The browser console will name the exact port it tried; set it explicitly with `VITE_RETICLE_WS_URL=ws://localhost:4400/reticle` or `reticle.connect({ url })`.
184
+
185
+ Still stuck? `npx @reticlehq/server doctor` checks Chromium, the daemon and the port in one command.
186
+
187
+ <CardGroup cols={2}>
188
+ <Card title="Instrument your app" icon="wrench" href="/instrumentation">
189
+ Register stores, signals and testids so your verdicts get stronger than "the DOM changed".
190
+ </Card>
191
+ <Card title="Quickstart" icon="rocket" href="/quickstart">
192
+ Drive your first flow and read a real verdict.
193
+ </Card>
194
+ </CardGroup>