@reticlehq/server 2.7.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.
- package/README.md +14 -5
- package/SKILL.md +64 -29
- package/dist/capsule/causal-summary.d.ts +20 -0
- package/dist/capsule/causal-summary.js +31 -6
- 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 +28 -25
- package/dist/cli/cli-kill.d.ts +58 -0
- package/dist/cli/cli-kill.js +162 -0
- package/dist/cli/cli-launch.d.ts +17 -0
- package/dist/cli/cli-launch.js +28 -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 +8 -0
- package/dist/cli/cli-port.js +16 -0
- package/dist/cli/cli-verify.js +2 -2
- package/dist/cli/doctor-sessions-line.d.ts +12 -0
- package/dist/cli/doctor-sessions-line.js +66 -0
- package/dist/cli/port-holder.d.ts +10 -0
- package/dist/cli/port-holder.js +26 -2
- package/dist/cli.js +99 -14
- 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 +14 -0
- package/dist/events/contradictions.js +26 -17
- package/dist/events/predicate-eval.d.ts +20 -1
- package/dist/events/predicate-eval.js +125 -3
- package/dist/events/predicate.js +170 -18
- package/dist/flows/flow-classify.js +1 -1
- package/dist/flows/flow-tools.js +12 -4
- package/dist/flows/heal-run.js +1 -1
- package/dist/honesty/blind-spots.js +6 -2
- package/dist/honesty/unsettled.d.ts +40 -0
- package/dist/honesty/unsettled.js +78 -0
- package/dist/honesty/verified.d.ts +7 -0
- package/dist/honesty/verified.js +3 -3
- package/dist/index.js +3 -0
- package/dist/init/agent-rules.d.ts +16 -0
- package/dist/init/agent-rules.js +96 -22
- package/dist/init/astro-patch.d.ts +2 -1
- package/dist/init/astro-patch.js +11 -5
- package/dist/init/capabilities.d.ts +22 -0
- package/dist/init/capabilities.js +76 -0
- package/dist/init/confirm.d.ts +96 -0
- package/dist/init/confirm.js +138 -0
- package/dist/init/cra.js +3 -2
- package/dist/init/non-js-project.js +29 -5
- package/dist/init/plan-framework.js +53 -15
- package/dist/init/plan.d.ts +40 -4
- package/dist/init/plan.js +163 -40
- package/dist/init/run.d.ts +24 -2
- package/dist/init/run.js +148 -42
- package/dist/init/slash-command.d.ts +1 -1
- package/dist/init/slash-command.js +46 -6
- package/dist/init/snippets.d.ts +44 -4
- package/dist/init/snippets.js +161 -37
- package/dist/init/vite-config.js +29 -3
- package/dist/input/network-mock-tools.d.ts +19 -0
- package/dist/input/network-mock-tools.js +29 -4
- package/dist/license/license.js +1 -1
- package/dist/mcp/mcp-proxy.d.ts +69 -3
- package/dist/mcp/mcp-proxy.js +205 -20
- package/dist/mcp/mcp.js +23 -7
- package/dist/mcp/proxy-lifecycle.d.ts +1 -1
- package/dist/mcp/proxy-lifecycle.js +1 -1
- 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/session/no-session-diagnosis.d.ts +19 -0
- package/dist/session/no-session-diagnosis.js +71 -18
- package/dist/session/no-session-watch.js +12 -0
- 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/telemetry/automation-hint.d.ts +17 -0
- package/dist/telemetry/automation-hint.js +71 -0
- package/dist/telemetry/bug-found.d.ts +0 -20
- package/dist/telemetry/bug-found.js +38 -21
- package/dist/telemetry/cli-telemetry.js +7 -1
- package/dist/telemetry/feedback.js +1 -1
- package/dist/telemetry/init-telemetry.js +9 -1
- package/dist/telemetry/install-source.d.ts +36 -0
- package/dist/telemetry/install-source.js +40 -0
- package/dist/telemetry/run-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.js +5 -0
- package/dist/telemetry/telemetry.d.ts +5 -1
- package/dist/telemetry/telemetry.js +15 -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 +45 -1
- package/dist/tools/assert-grade.d.ts +1 -1
- package/dist/tools/assert-grade.js +27 -5
- package/dist/tools/assert-verdict.js +18 -1
- package/dist/tools/contract-tools.js +4 -0
- package/dist/tools/dynamic-tools.js +1 -1
- package/dist/tools/error-recovery.d.ts +10 -0
- package/dist/tools/error-recovery.js +64 -4
- package/dist/tools/feedback-invite.js +1 -1
- package/dist/tools/invoke-tool.js +139 -23
- package/dist/tools/lease-tools.d.ts +29 -1
- package/dist/tools/lease-tools.js +58 -5
- package/dist/tools/navigate-result.js +1 -1
- package/dist/tools/observe-tools.js +1 -1
- package/dist/tools/observed-nothing.js +1 -1
- package/dist/tools/react-grace.d.ts +48 -0
- package/dist/tools/react-grace.js +87 -0
- package/dist/tools/read-tools.js +20 -4
- package/dist/tools/settle-in-flight.d.ts +79 -0
- package/dist/tools/settle-in-flight.js +106 -0
- package/dist/tools/snapshot-delta.d.ts +7 -0
- package/dist/tools/snapshot-delta.js +130 -6
- package/dist/tools/tool-surface.js +19 -0
- package/dist/tools/tools.js +16 -4
- package/docs/README.md +56 -11
- package/docs/actions.mdx +87 -0
- package/docs/agent-cheatsheet.md +93 -29
- package/docs/architecture.md +46 -35
- package/docs/benchmarks.md +76 -72
- package/docs/best-practices.mdx +211 -0
- package/docs/capabilities.mdx +387 -0
- package/docs/cli/affected.mdx +51 -0
- package/docs/cli/capsules.mdx +69 -0
- package/docs/cli/cloud.mdx +127 -0
- package/docs/cli/doctor.mdx +76 -0
- package/docs/cli/drive.mdx +55 -0
- package/docs/cli/feedback.mdx +67 -0
- package/docs/cli/gate.mdx +64 -0
- package/docs/cli/help.mdx +92 -0
- package/docs/cli/hunt.mdx +57 -0
- package/docs/cli/identify.mdx +62 -0
- package/docs/cli/init.mdx +94 -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 +68 -0
- package/docs/cli/restart.mdx +60 -0
- package/docs/cli/rollback.mdx +35 -0
- package/docs/cli/serve.mdx +62 -0
- package/docs/cli/status.mdx +64 -0
- package/docs/cli/stop.mdx +56 -0
- package/docs/cli/telemetry.mdx +57 -0
- package/docs/cli/update.mdx +52 -0
- package/docs/cli/verify.mdx +57 -0
- package/docs/cli/version.mdx +39 -0
- package/docs/cli/watch.mdx +55 -0
- package/docs/cli.mdx +219 -0
- package/docs/debugging.md +13 -9
- package/docs/deploy-checks.md +15 -11
- package/docs/desktop-apps.md +49 -40
- package/docs/desktop.mdx +188 -0
- package/docs/docs.json +363 -0
- package/docs/enterprise.md +20 -16
- package/docs/faq.mdx +88 -0
- package/docs/fixtures.md +11 -7
- package/docs/flows.md +26 -22
- package/docs/for-agents.md +71 -0
- package/docs/frameworks.mdx +199 -0
- package/docs/gate-plan.md +45 -41
- package/docs/gates.md +22 -18
- package/docs/getting-started.md +76 -65
- package/docs/human-control.md +22 -18
- package/docs/index.mdx +101 -0
- package/docs/install-agentic.mdx +215 -0
- package/docs/install-manual.mdx +194 -0
- package/docs/instrumentation.mdx +232 -0
- package/docs/integration-patterns.md +38 -34
- package/docs/local-registry.md +16 -12
- package/docs/multi-agent-testing.md +16 -12
- package/docs/packages/babel-plugin.mdx +70 -0
- package/docs/packages/browser.mdx +111 -0
- package/docs/packages/core.mdx +106 -0
- package/docs/packages/electron.mdx +87 -0
- package/docs/packages/eslint-plugin.mdx +84 -0
- package/docs/packages/next.mdx +91 -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 +108 -0
- package/docs/packages/vite-plugin.mdx +96 -0
- package/docs/packages.mdx +217 -0
- package/docs/platform-integration.md +33 -26
- package/docs/predicates.mdx +179 -0
- package/docs/quickstart.mdx +211 -0
- package/docs/recipes.mdx +242 -0
- package/docs/skill-file.mdx +105 -0
- package/docs/state-management.mdx +197 -0
- package/docs/style.css +14 -0
- package/docs/system-map.md +47 -32
- package/docs/telemetry-contract.md +93 -50
- package/docs/telemetry-events.mdx +430 -0
- package/docs/telemetry.md +57 -52
- package/docs/testing.md +10 -6
- package/docs/token-efficiency.md +30 -26
- package/docs/tools-act-and-wait.mdx +123 -0
- package/docs/tools-act-sequence.mdx +120 -0
- package/docs/tools-act.mdx +82 -0
- package/docs/tools-assert.mdx +70 -0
- package/docs/tools-console.mdx +59 -0
- package/docs/tools-inspect.mdx +85 -0
- package/docs/tools-navigate.mdx +63 -0
- package/docs/tools-network.mdx +86 -0
- package/docs/tools-observe.mdx +89 -0
- package/docs/tools-overview.mdx +157 -0
- package/docs/tools-query.mdx +82 -0
- package/docs/tools-session-and-feedback.mdx +91 -0
- package/docs/tools-sessions.mdx +65 -0
- package/docs/tools-snapshot.mdx +75 -0
- package/docs/tools-state.mdx +81 -0
- package/docs/tools-tools-and-run.mdx +125 -0
- package/docs/tools-wait-for.mdx +66 -0
- package/docs/troubleshooting.mdx +193 -0
- package/docs/usage.md +175 -153
- package/docs/vs-chrome-devtools-mcp.mdx +82 -0
- package/docs/vs-playwright-mcp.mdx +85 -0
- package/docs/vs-screenshots.mdx +96 -0
- package/docs/what-is-reticle.mdx +63 -0
- package/docs/why-reticle.mdx +107 -0
- package/package.json +2 -2
- 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/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
|
+

|
|
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>
|